문제


<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

 

풀이


문제를 보고 앞서 풀었던 유기농 배추 문제와 매우 비슷하다고 생각되었다. 실제로 코드도 거의 똑같다. 유기농 배추 문제와 같이 집이 있는 '1'인 부분들로 이루어진 group을 만든다. group을 만드는 과정에서 '1'인 부분이 있다면 count를 해준다. 

 

이 문제는 생각보다 오래 풀었는데.. 알고보니 dfs함수에서 맵의 범위를 설정해주는 if문이 nx, ny에 대해가 아닌 nx, nx를 비교해서 오래걸렸다....

 

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def dfs(x, y):
    global cnt
    
    array[x][y] = 0
    cnt += 1

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        
        if 0 <= nx < N and 0 <= ny < N: # 이 부분에서 실수했다!!!
            if array[nx][ny] == 1:
                dfs(nx, ny)
                
N = int(input())

# 맵 구성
array = []
for _ in range(N):
    array.append(list(map(int, input())))
    
# 탐색
result = []
for i in range(N):
    for j in range(N):
        if array[i][j] == 1: # 집이 있다면    
            cnt = 0
            dfs(i, j)
            result.append(cnt) # 최소 1개

result.sort()
print(len(result))
for i in result:
    print(i)

'Algorithm > 문제 풀이' 카테고리의 다른 글

[Backjoon 11659] 구간 합 구하기 4  (0) 2022.10.30
[Backjoon 5525] IOIOI  (0) 2022.10.30
[Backjoon 1764] 듣보잡  (0) 2022.10.29
[Backjoon 1012] 유기농 배추  (0) 2022.10.29
[Backjoon 1003] 피보나치 함수  (0) 2022.10.29
복사했습니다!