코딩테스트/Python
[Python] 백준 #2667 - 단지번호붙이기
yo~og
2021. 12. 12. 15:47
문제
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
풀이
import sys
input = sys.stdin.readline
def dfs(i,j):
visited[i][j] = True # 방문한 곳을 True로 바꾸기
cnt[-1]+=1 # 바꾸고 cnt 1 증가
for p in range(4): # 상하좌우로 방문
cx = d[p][0] + i
cy = d[p][1] + j
if 0<= cx < N and 0 <= cy < N: # 계산한 좌표가 범위안이면
if arr[cx][cy]=='1' and visited[cx][cy]==False: # cx,cy의 arr 이 1 이고 아직 방문하지 않았다면
dfs(cx,cy) # 탐색
arr,cnt,visited=[],[],[]
d = [[0,1],[1,0],[-1,0],[0,-1]] #상하좌우
N = int(input())
for _ in range(N):
arr.append(list(input()[:-1]))
visited.append([False]*N)
for i in range(N):
for j in range(N):
if arr[i][j]=="1" and visited[i][j]==False: # 1이면서 방문하지 않은곳이면
cnt.append(0) #
dfs(i,j) # 탐색하기
print(len(cnt))
print("\n".join(map(str,sorted(cnt))))
DFS로 풀었다.
- 2중 for 문을 돌리면서 1 이면서 방문하지 않은 곳이면 dfs로 탐색해준다.
- dfs에서는 상하좌우로 방문해주면서 계산한 좌표가 범위안이라면 탐색해주었다.