티스토리 뷰
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
1. 문제 내용
2. 접근 방식
- 첫 시작점인 (0, 0)이 1일 수도, 0일 수도 있다.
이 문제는 기본적으로 2178번 미로탐색 문제와 해결 방식이 똑같다. 그러나 2가지 차이점 중 하나가 바로 시작점이 무조건 1이 아니라, 0과 1 모두 가능하다는 것이다. 따라서 이중 for문을 통해서 방문하지 않은 것 중에서 1인 칸을 찾은 후, bfs() 메서드를 실행해야겠다고 판단했다.
- 단지에 속하는 집의 수는 count 변수로 구한다.
미로 탐색 문제와의 또 다른 차이점은 visited 리스트 값을 누적할 필요가 없다는 것이다. 최소 거리를 찾는 것이 아니라, 단순히 한 그래프 한 덩어리를 이루는 칸의 개수를 구하는 것이므로 단순히 count 변수에 + 1하면 된다.
3. 정답 코드
from collections import deque
def bfs(p, q):
visited[p][q] = 1
queue = deque([[p, q]])
count = 0
while queue:
x, y = queue.popleft()
count += 1
for d in directions:
dx = x + d[0]
dy = y + d[1]
if dx >= n or dx < 0 or dy >= n or dy < 0:
continue
if graph[dx][dy] and not visited[dx][dy]:
visited[dx][dy] = True
queue.append([dx, dy])
return count
def print_answer(results):
print(len(results))
for r in sorted(results):
print(r)
# main
n = int(input())
graph = [list(map(int, input())) for _ in range(n)]
visited = [[False] * n for _ in range(n)]
directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]
answers = []
for i in range(n):
for j in range(n):
if graph[i][j] and not visited[i][j]:
answers.append(bfs(i, j))
print_answer(answers)
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 7576번 토마토 파이썬 정답 코드 (0) | 2023.05.24 |
---|---|
[백준] 1012번 유기농 배추 파이썬 정답 코드 (0) | 2023.05.23 |
[백준] 2178번 미로 탐색 파이썬 정답 코드 (0) | 2023.05.23 |
[백준] 1003번 피보나치 함수 파이썬 정답 코드 (0) | 2023.05.21 |
[백준] 1260번 DFS와 BFS 파이썬 정답 코드 (0) | 2023.05.21 |