Liam SY Kim
by Liam SY Kim
2 min read

Categories

문제 링크

전체 코드

문제 이해 및 적용하기

이 문제는 정사각형 Matrix를 입력받고 1은 집이 있는곳, 0은 집이 없는 곳으 나타낸다. 지도를 가지고 연결된 단지수를 구하고 단지으 수와 각 단지별 집의 수르 오름차순을 출력해줌 되는 문제이다.

접근은 기본적으로 하나의 단지를 BFS(또는 DFS)로 구하고 단지를 Matrix를 순회하면서 찾아내는 식을 문제를 풀어보았다.

전체 Matrix 입력과 각 단지별 집의 수를 담는 answerList를 초기화해주었다.

# init matrix & answer list
n = int(input())
matrix = []
for i in range(n):
  temInput = input()
  row = [int(temInput[j]) for j in range(n)]
  matrix.append(row)

ansList = []

dx, dy를 통항 동남서북 순으로 BFS를 순환할 수 있도로 해주었고, collection deque를 사용하여 queue를 적용하였다.

queue에 들어가기 이전에 matrix의 좌표값을 1->0 을 바꾸어주었으며, 이렇게 바꾸어줌으로써 다음 다른 좌표를 기준으로 BFS를 할 때에 다시 queue에 집어넣지 않도록 해주었다.

queue에서 pop할 때마다 number of count를 세어 줌으로써 단지 내 집수를 추가하였다. queue 안의 좌표값이 다 출력이 되어서 비어지면 number of count를 바로 answer list에 넣어주지않고 반환해줌으로써 현재 단지수를 다 새지 않고 Matrix를 순회하는 것을 방지해주었다.

# bfs
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def bfs(row, col):
  numberOfCount = 0
  queue = deque()
  queue.append([row,col])
  matrix[col][row] = 0
  while(queue):
    curRow, curCol = queue.popleft()
    numberOfCount += 1
    for i in range(4):
      tx = curRow + dx[i]
      ty = curCol + dy[i]
      if tx < 0 or tx > n-1 or ty < 0 or ty > n-1 or matrix[ty][tx] == 0 :
        continue
      else:
        matrix[ty][tx] = 0
        queue.append([tx,ty])
  return numberOfCount

matrix를 순회하고 결과값을 오름차순으로 출력해주었다.

# iterate matrix 
for i in range(n):
  for j in range(n):
    if matrix[i][j] == 1:
      ansList.append(bfs(j,i))

ansList.sort(reverse=False)
print(len(ansList))
for i in range(len(ansList)):
  print(ansList[i])

주의할 점

  • BFS에 number of count를 반환해줌으로써 현재 단지수를 다 새지 않고 Matrix를 순회하는 것을 방지
  • BFS queue에서 pop하고나서 1->0으로 바꾸어주는게 아니라 queue에 들어가기 전에 matrix 값으 1->0 으로 변환해줌으로써, queue에서 pop되기 이전에 다른 좌표로부터 중복참조가 되는 것으로부터 방지

전체 코드

import sys
from collections import deque
input = sys.stdin.readline

# bfs
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def bfs(row, col):
  numberOfCount = 0
  queue = deque()
  queue.append([row,col])
  matrix[col][row] = 0
  while(queue):
    curRow, curCol = queue.popleft()
    numberOfCount += 1
    for i in range(4):
      tx = curRow + dx[i]
      ty = curCol + dy[i]
      if tx < 0 or tx > n-1 or ty < 0 or ty > n-1 or matrix[ty][tx] == 0 :
        continue
      else:
        matrix[ty][tx] = 0
        queue.append([tx,ty])
  return numberOfCount

# init matrix & answer list
n = int(input())
matrix = []
for i in range(n):
  temInput = input()
  row = [int(temInput[j]) for j in range(n)]
  matrix.append(row)

ansList = []

# iterate matrix 
for i in range(n):
  for j in range(n):
    if matrix[i][j] == 1:
      ansList.append(bfs(j,i))

ansList.sort(reverse=False)
print(len(ansList))
for i in range(len(ansList)):
  print(ansList[i])