2667 : 단지번호붙이기

서희찬·2021년 10월 7일
0

백준

목록 보기
61/105

문제

코드

import sys
sys.setrecursionlimit(10**6)
input=sys.stdin.readline

cnt=0;total=1

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

def dfs(x,y):
  global total
  graph[x][y]=0 #방문 ! 
  for i in range(4):
      cx = x+dx[i]
      cy = y+dy[i]
      if 0<=cx<n  and 0<=cy<n and graph[cx][cy]==1:
        total+=1
        dfs(cx,cy)

n = int(input())
graph = []
for i in range(n):
    graph.append(list(map(int, input().rstrip())))


for j in range(n):
    for k in range(n):
        if (graph[j][k]==1):
            dfs(j,k)
            cnt+=1
            apt.append(total)
            total=1

apt.sort()
print(cnt) #총집 
for i in range(cnt):
  print(apt[i])

해설

오늘 문제를 풀면서 대박대박적인것을 알아냈다.
바로

sys.stdin.readline

은 리스트에서 입력받을때 개행을 포함한다는것이다..!!
대박이지 않은가?!
그래서 list(map(int, input().rstrip())) 이 코드를 실행시킬때

ValueError : invalid literal for int() with base 10: '\n'

이와 같은 오류가 계속 떴었다.
이를 없애주는 방법은 바로 sys.stdin.readline().rstrip()을 통해 개행을 없애줘야한다는것이다..!

그 이후 입력값이 제대로 리스트에 들어와 DFS탐색을 이용하여 그래프를 탐색했다. dx,dy로 위아래로 이동할 수 있는 툴을 만들 수 있는거 또한 앞선 문제에서 사용한 방식 그대로 가져왔다.

BFS/DFS문제를 5-6문제 정도 풀어봤는데
상하좌우 이동하는 법과 최대깊이까지 가는것 이 두가지툴이 거의 사용되는 것 같다..!
꿀잼!!!

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글