Solve "count islands" problem
This morning, I attended the "Interview Club" and was asked this question by the interviewer in front of ~20 FTEs. While I struggled to fully solve it during the abridged (i.e. 20 minute) timeslot, I completed the problem afterwards. Here is my solution.
This commit is contained in:
		
							parent
							
								
									fa717e8a6f
								
							
						
					
					
						commit
						f652ea0be6
					
				
					 1 changed files with 53 additions and 0 deletions
				
			
		
							
								
								
									
										53
									
								
								scratch/facebook/count-islands.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								scratch/facebook/count-islands.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | ||||||
|  | from collections import deque | ||||||
|  | 
 | ||||||
|  | def maybe_queue(row, col, game, q, seen): | ||||||
|  |     """ | ||||||
|  |     Add coordinate, (`row`, `col`), to the queue, `q`, as long as it exists in | ||||||
|  |     the map, `game`, and it is not already present in `seen`. | ||||||
|  |     """ | ||||||
|  |     if row >= 0 and row < len(game) and col >= 0 and col < len(game[0]): | ||||||
|  |         if game[row][col] == 'L' and (row, col) not in seen: | ||||||
|  |             q.append((row, col)) | ||||||
|  | 
 | ||||||
|  | def visit_island(row, col, game, seen): | ||||||
|  |     """ | ||||||
|  |     Starting at the coordinate, (`row`, `col`), in the map, `game`, visit all | ||||||
|  |     surrounding tiles marked as land by adding them to the `seen` set. | ||||||
|  |     """ | ||||||
|  |     q = deque() | ||||||
|  |     q.append((row, col)) | ||||||
|  |     while q: | ||||||
|  |         row, col = q.popleft() | ||||||
|  |         seen.add((row, col)) | ||||||
|  |         maybe_queue(row - 1, col, game, q, seen) # UP | ||||||
|  |         maybe_queue(row + 1, col, game, q, seen) # DOWN | ||||||
|  |         maybe_queue(row, col - 1, game, q, seen) # LEFT | ||||||
|  |         maybe_queue(row, col + 1, game, q, seen) # RIGHT | ||||||
|  | 
 | ||||||
|  | def count_islands(game): | ||||||
|  |     """ | ||||||
|  |     Return the number of contiguous land tiles in the map, `game`. | ||||||
|  |     """ | ||||||
|  |     result = 0 | ||||||
|  |     seen = set() | ||||||
|  |     for row in range(len(game)): | ||||||
|  |         for col in range(len(game[row])): | ||||||
|  |             if game[row][col] == 'L' and (row, col) not in seen: | ||||||
|  |                 visit_island(row, col, game, seen) | ||||||
|  |                 result += 1 | ||||||
|  |     return result | ||||||
|  | 
 | ||||||
|  | ################################################################################ | ||||||
|  | # Tests | ||||||
|  | ################################################################################ | ||||||
|  | 
 | ||||||
|  | game = [ | ||||||
|  |     "LWLWWW", | ||||||
|  |     "LLLWWW", | ||||||
|  |     "WWWLLW", | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | result = count_islands(game) | ||||||
|  | print(result) | ||||||
|  | assert result == 2 | ||||||
|  | print("Success!") | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue