코딩 테스트/백준
[Python] 백준 2667 단지번호붙이기
위시리
2025. 2. 7. 16:00
문제 분석
- 1 : 집이 있는 곳
- 0 : 집이 없는 곳
- 상하좌우 연결
- 출력 : 단지 수, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력
코드 설계
- 단지의 집 개수를 찾기 위한 시작 집 찾기
- 1이고, 아직 방문하지 않은 집
- 집을 찾으면 해당 단지의 가구 수 체크
- 단지에 해당하는 집을 다 찾으면 단지수 count
정답 코드
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
house = [list(input().strip()) for _ in range(n)]
v = [[False] * n for _ in range(n)]
dan = 0 # 총 단지 수
apts = [] # 아파트의 수를 저장할 배열
d = deque()
dh = [-1, 1, 0, 0]
dw = [0, 0, -1, 1]
# 1. 새로운 단지의 집 찾기 : 처음 시작하는 집은 한번도 방문하지 않은 집
for i in range(n) :
for j in range(n) :
if house[i][j] == '1' and not v[i][j] : # 1이면서 아직 방문하지 않은
v[i][j] = True
d.append((i,j))
cnt_apt = 0 # 아파트 수 리셋
while d:
# 2. 해당 단지의 아파트 수 세기
h, w = d.popleft()
cnt_apt += 1
for k in range(4) :
nh = h + dh[k]
nw = w + dw[k]
if nh < 0 or nh >= n or nw < 0 or nw >= n :
continue
if v[nh][nw]: # true : 이미 방문했다면
continue
if house[nh][nw] != '1' :
continue
# 해당 단지에 다른 집이 있다면
v[nh][nw] = True
d.append((nh,nw))
apts.append(cnt_apt)
dan += 1
print(dan)
print('\n'.join(map(str, sorted(apts))))