이것이 코딩테스트다 with 파이썬 - Chp5. DFS/BFS_3. 음료수 얼려먹기

Alex·2022년 3월 23일
0

이코테 with 파이썬

목록 보기
16/33
# n, m을 입력받기
# 얼음틀의 형태 입력받기
# 0이 따로 떨어져있는 부분 카운팅

n, m = map(int, input().split())

tray = []
for i in range(n):
    tray.append(list(map(int, input().split())))

def DFS(x, y):
    if x <= -1 or x >= n or y <= -1 or y >= m:
        return False
    if tray[x][y] == 0:
        tray[x][y] = 1
        DFS(x-1, y)
        DFS(x, y-1)
        DFS(x+1, y)
        DFS(x, y+1)
        return True
    return False

count = 0
for i in range(n):
    for j in range(m):
        if DFS(i, j) == True:
            count += 1
print(count)
  • 정답 예시
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())

# 2차원의 리스트의 맵 정보 입력받기
graph = []
for i in range(n):
    graph.append(list(map(int, input().split())))

# DFS로 특정한 노드를 방문한 뒤에 연결된 모든 노드들도 방문
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


# 모든 노드(위치)에 대하여 음료수 채우기
result = 0
for i in range(n):
    for j in range(m):
        # 현재 위치에서 DFS수행
        if dfs(i, j) == True:
            result += 1

print(result)

-> 묶음을 찾는 코드 작성이 어려웠다.

  1. 특정한 지점의 주변 상, 하, 좌, 우를 살펴본 뒤에 주변 지점 중에서 값이 '0'이면서 아직 방문하지 않은 지점이 있다면 해당 지점을 방문한다.
  2. 방문한 지점에서 다시 상, 하, 좌, 우를 살펴보면서 방문을 다시 진행하면, 연결된 모든 지점을 방문할 수 있다.
  3. 1~2번의 과정을 모든 노드에 반복하며 방문하지 않은 지점의 수를 센다.
profile
With Data or Without Data?

0개의 댓글

관련 채용 정보