본문 바로가기

백준 문제 풀이 및 피드백

2023.01.15 단지번호붙이기 백준

https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

 

import sys
input = sys.stdin.readline
def main():
    n = int(input().strip())

    graph = [list(input().strip()) for _ in range(n)]

    apart_lens = []
    
    def dfs(x,y):
        nonlocal graph
        nonlocal count
        if 0 <= x < n and 0 <= y < n and graph[x][y] == '1': # 방문을 안하거나 범위 내에 있을 때만 동작
            graph[x][y] = '0'
            count += 1
            dfs(x+1,y)
            dfs(x-1,y)
            dfs(x,y+1)
            dfs(x,y-1)
        return count

    for i in range(n):
        for j in range(n):            
            if graph[i][j] =='0':# 방문 한 곳은 지나치기
                continue
            count = 0                       
            apart_lens.append(dfs(i,j))  
    apart_lens = sorted(apart_lens) 
    print(len(apart_lens))
    for i in apart_lens:
        print(i)

main()

dfs로 각 단지의 번호를 돌면서 방문한 곳과 아닌 곳을 찾아주면서 방문을 안한곳의 개수를 찾아서 count 로 넘겨준다.

 

중간에 대입을 해야하는데 ==를 써버려서 무한 반복이 되어 2시간 동안 막히다가 겨우 풀었다. 이런 실수를 줄이기 위해서 막혔을 때는 모든걸 의심 하면서 하나하나 맞는지 돌아가봐야겠다.