본문 바로가기

코딩테스트/백준

[Python] 백준 2667번. 단지번호 붙이기

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

풀이

  • 입력받은 배열에 1이 있다면 dfs 함수를 호출합니다.
  • x,y의 인덱스가 n보다 크거나 0보다 작아지면 배열 범위를 벗어나기 때문에 return을 합니다.
  • x,y 좌표에 1이 있다면 count을 증가시킵니다. -> 1의 갯수를 셉니다.
  • 위,아래,오른쪽,왼쪽을 확인하며 1이 있는지 확인합니다.
  • 1이 있다면 다시 dfs을 호출합니다.
import sys

input = sys.stdin.readline

N = int(input())
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

result = []
count = 0
def dfs(x, y):
    global count

    if x < 0 or x >= N or y < 0 or y >= N:
        return

    if maps[x][y] == '1':
        count += 1
        maps[x][y] = '0'
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            dfs(nx, ny)

maps = list()
for i in range(N):
   maps.append(list(input()))

for i in range(N):
    for j in range(N):
        if maps[i][j] == '1':
            dfs(i, j)
            result.append(count)
            count = 0

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