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)

좋은 웹페이지 즐겨찾기