알고리즘

[코드트리 - 연습/dfs, bfs] 마을 구분하기

김치말이삼겹살 2024. 4. 24. 11:07

요즘 코드트리로 사람들이 코딩 공부 많이 하는 것 같아서, 공부 플랫폼을 옮겨봤다.

 

시작하며 레벨 테스트를 하는데 DFS, BFS부터 막혀서 20분째 끙끙댔다...

 

https://www.codetree.ai/missions/2/problems/seperate-village/discussions

 

미래에셋도 그렇고 삼성도 그렇고 DFS, BFS 코드는 외워서 칠 수 있다는 자부심 하나로 살아왔는데, 그렇지 않은 것 같아 현타가 줄줄 났다.

 

그래서 이번에는 dfs를 재귀가 아닌 반복문 활용해서 구현한 코드를 소개하고자 한다.

n = int(input())
graph = [list(map(int,input().split())) for _ in range(n)]
visited = [[-1] * n for _ in range(n)]


def dfs(x,y):
    visited[x][y] = 1
    count = 1
    dx = [-1,1,0,0]
    dy = [0,0,1,-1]
    stack = []
    stack.append((x,y))
    while stack:
        n_x,n_y = stack.pop()
        for i in range(4):
            nx = n_x + dx[i]
            ny = n_y + dy[i]
            if 0<= nx < n and 0 <= ny <n:
                if visited[nx][ny] == -1 and graph[nx][ny] == 1:
                    stack.append((nx,ny))
                    visited[nx][ny] = 1
                    count += 1
    return count
village = []
# count = 0
for i in range(n):
    for j in range(n):
        if graph[i][j] == 1 and visited[i][j] == -1:
            people = dfs(i,j)
            # count += 1
            village.append(people)
village.sort()
print(len(village))
for i in range(len(village)):
    print(village[i])

 

 

진단평가에서 틀린 이유가 뭘까..

 

세상이 나를 억까한 게 아닐까 했는데, 내가 자초한 실수에 그딴 건 없었다.

 

반복문을 사용할 때 방문 체크를 할 때 visited 넣는 것을 안한 게 실수였다.

 

다음엔 이런 실수 절대 하지 않도록 주의해야겠다.

반응형