반응형
# 2차원 배열 map은 모두 정수 타입 숫자들로 채워져 있다. 여기서 0은 바다를 뜻하고 0 이외의 값은 땅을 뜻한다. map에 몇 개의 섬이 있는지 반환하는 함수를 구현하라.
# map = [ [ 1, 1, 0, 0, 0 ],
# [ 1, 0, 0, 0, 0 ],
# [ 0, 0, 0, 1, 0 ],
# [ 0, 1, 0, 0, 0 ],
# [ 1, 1, 1, 0, 0 ] ]
# the return value should be 3
def search_bfs(i,j,map):
global result
#맨 처음 위치
q = []
q.append((i,j))
check[i][j] = True
while q:
x,y = q.pop(0) #bfs
for k in range(4) : #4방향 이동
nx, ny = x+dx[k], y+dy[k]
# 경계 체크
if nx<0 or ny<0 or nx>=n or ny>=m :
continue
# 땅 체크
if map[nx][ny] != 0 :
if not check[nx][ny] :
check[nx][ny] = True
q.append((nx,ny))
result += 1
return result
def search_dfs(i,j,map):
global result
#처음위치
s=[]
s.append((i,j))
check[i][j] = True
while s:
x,y = s.pop() #dfs
for k in range(4) : #4방향 이동
nx, ny = x+dx[k], y+dy[k]
# 경계 체크
if nx<0 or ny<0 or nx>=n or ny>=m :
continue
# 땅 체크
if map[nx][ny] != 0 :
if not check[nx][ny] :
check[nx][ny] = True
s.append((nx,ny))
result += 1
return result
def search_dfs_recur(i,j,map):
check[i][j] = True
global result
result += 1
for k in range(4):
nx,ny = i+dx[k], j+dy[k]
if nx<0 or ny<0 or nx>=n or ny>=m :
continue
if map[nx][ny] == 0:
continue
#재귀호출
if not check[nx][ny]:
search_dfs_recur(nx,ny,map)
if __name__ == '__main__':
map = [ [ 1, 0, 0, 1, 0 ],
[ 1, 0, 0, 0, 0 ],
[ 0, 0, 0, 1, 0 ],
[ 0, 1, 0, 0, 0 ],
[ 1, 1, 1, 0, 0 ] ]
n = len(map)
m = len(map[0])
result = 0 #섬의 개수
ans = []
# 4방향 이동
dx = [-1,1,0,0]
dy = [0,0,-1,1]
check = [ [False]*(m) for _ in range(n) ]
#출발점
for i in range(n):
for j in range(m):
if not check[i][j] and map[i][j] != 0 :
#search_bfs(i,j,map)
#search_dfs(i,j,map)
result = 0
search_dfs_recur(i,j,map)
ans.append(result)
print(result)
print(ans)
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[브루트포스/재귀함수] N개 알파벳 중에 R개를 나열하는 경우 (4) | 2021.04.05 |
---|---|
Leet Code 121. Best Time to Buy and Sell Stock (4) | 2021.04.04 |
[DP] Leet code 118. Pascal's Triangle (4) | 2021.04.04 |
[이진트리/DFS] Leet code 104 - Maximum Depth of Binary Tree (2) | 2021.04.03 |
[BFS / 이진트리] LeetCode 101. Symmetric Tree (4) | 2021.03.23 |
댓글