DFS : 음료수 얼려 먹기
문제정의
N x M 크기의 얼음 틀이 있습니다. 구멍이 뚫려있는(사용가능한) 부분은 0 칸막이가 존재하는(사용불가능한) 부분은 1로 표시됩니다. 구멍이 뚫려있는 부분끼리 상, 하, 좌, 우로 붙어있는 경우 서로 연결되어있는 것으로 간주합니다. 이 때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하세요. 다음의 4 x 5 얼음 틀 예시에서는 아이스크림이 총 3개 생성됩니다.
입력 조건
- 첫번째 줄에 얼음 틀의 세로길이 N과 가로길이 M이 주어집니다. (1<=N, M<=1000)
- 두번째 줄부터 N+1번째 줄까지 얼음 틀의 형태가 주어집니다.
- 이 때 구멍이 뚫려있는 부분은 0, 그렇지 않은 부분은 1입니다.
출력조건
- 한 번에 만들 수 있는 아이스크림의 개수를 출력합니다.
입력예시
4 5
00110
00011
11111
00000
출력예시
3
내가짠코드
# N, M을 공백 기준으로 구분하여 입력받기
n, m = map(int, input().split())
# 2차원 리스트의 맵 정보 입력받기
graph = []
for i in range(n):
graph.append(list(map(int, input())))
def dfs(i,j):
if i >= 0 and i < n and j >= 0 and j < m:
if graph[i][j] == 0:
graph[i][j] = True
# 아래 네개는 해당 위치의 값을 True로 만들어서 방문처리하는것
dfs(i-1,j)
dfs(i+1,j)
dfs(i,j-1)
dfs(i,j+1)
return True
cnt = 0
for i in range(n):
for j in range(m):
result = dfs(i,j)
if result == True:
cnt += 1
print(cnt)
정답코드
def dfs(x,y):
# 주어진 범위를 벗어나는 경우에는 즉시 종료
if x<= -1 or x >= n or y <= -1 or y >= m:
return False
# 현재 노드를 아직 방문하지 않았다면
if graph[x][y] == 0:
# 해당 노드 방문 처리
graph[x][y] = 1
# 상, 하, 좌, 우의 위치들도 모두 재귀적으로 호출
dfs(x-1, y)
dfs(x, y-1)
dfs(x+1, y)
dfs(x, y+1)
return True
return False
# N, M을 공백 기준으로 구분하여 입력받기
n, m = map(int, input().split())
# 2차원 리스트의 맵 정보 입력받기
graph = []
for i in range(n):
graph.append(list(map(int, input())))
# 모든 노드(위치)에 대하여 음료수 채우기
result = 0
for i in range(n):
for j in range(m):
# 현재 위치에서 dfs 수행
if dfs(i, j) == True:
result += 1
print(result)
Author And Source
이 문제에 관하여(DFS : 음료수 얼려 먹기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yozzum/DFSBFS-음료수-얼려-먹기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)