개발 연습장/백준 문제풀이

[파이썬, Python] 백준 2667: 단지번호붙이기

LooanCheong 2023. 4. 14. 12:23
반응형

문제

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

코드

from collections import deque


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

n = int(input())
home = list()
ans = []

def bfs(home, a, b):
    cnt = 1
    queue = deque()
    queue.append((a, b))
    home[a][b] = 0
    
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if nx < 0 or nx >= n or ny < 0 or ny >= n:
                continue
            if home[nx][ny] == 1:
                home[nx][ny] = 0
                queue.append((nx, ny))
                cnt += 1
    return cnt

for i in range(n):
    home.append(list(map(int, input())))

for a in range(n):
    for b in range(n):
        if home[a][b] == 1:
            ans.append(bfs(home, a, b))
            
print(len(ans))
for i in sorted(ans):
    print(i)

설명

https://looancheong.tistory.com/164

이 문제와 굉장히 유사하다.

차이점이 있다면,
bfs 내에서 횟수를 카운트해서 카운트 값을 리턴한다는 점이다.

그리고 처음에 입력값을 그냥 그대로 받아서 str로 처리되어서 고민하고 있었는데,
list(map(int, input())) 형식으로 처리하면 split 없이도 각 항목이 처리된다는 걸 처음 알았다.
아마 각 값에 int 값을 매핑해서 그렇게 되는 것 같다.

ans의 개수와 각 ans의 값을 정렬 상태에서 출력해 주면 된다.

반응형