https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
<문제>
<풀이>
그래프가 입력으로 주어지고, 각 노드마다 탐색의 범위가 상하좌우로 제한된다. 앞서 해결했던 미로 탐색과 순열 사이클을 섞어놓은 듯 한 문제이다.
따라서 다음과 같은 과정으로 출력값을 얻었다.
1. 전체 그래프를 탐색하는 2중 반복문을 작성한다.
2. 방문하지 않은 노드가 나올 때마다 그래프 탐색(DFS, BFS)를 실시한다.
3. 각 그래프를 탐색했을때 노드의 개수를 저장하고 정렬한 다음에 출력한다.
<코드>
from collections import deque
def bfs(v):
bfsQ = deque()
bfsQ.append(v)
isVisited[v[0]][v[1]] = True
moves = [(1, 0), (-1, 0), (0, 1), (0, -1)]
count = 1
while bfsQ:
node = bfsQ.popleft()
for move in moves:
row = node[0] + move[0]
column = node[1] + move[1]
if row < 0 or row >= n or column < 0 or column >= n:
continue
if graph[row][column] != 0 and not isVisited[row][column]:
isVisited[row][column] = True
bfsQ.append((row, column))
count += 1
return count
n = int(input())
graph = []
for _ in range(n):
temp = input()
graph.append(list(map(int, temp)))
isVisited = [[False] * n for i in range(n)]
area = []
for row in range(n):
for column in range(n):
if graph[row][column] == 1 and not isVisited[row][column]:
area.append(bfs((row, column)))
area.sort()
print(len(area))
for i in range(len(area)):
print(area[i])
<참고>
https://junmusu.tistory.com/35
[백준]BOJ 10451 - 순열 사이클 - Python
순열이 각각의 (1부터 시작하는)인덱스와 매칭되어있는 그래프를 만들면 쉽게 해결된다. (친절하게 문제에 그림도 있다.) 순열과 인덱스는 내부 원소들이 순서를 제외하고 같으므로 무조건 내부
junmusu.tistory.com
https://junmusu.tistory.com/34
[백준]BOJ 2178 - 미로 탐색 - Python
입력값으로 미로의 크기와 구성이 주어진다. 미로 안에서는 값이 1인 칸으로만 이동 할 수 있고, 또 각 칸에서는 상하좌우의 칸으로밖에 이동하지 못한다. -> 현재 칸에서 상하좌우의 칸을 탐색
junmusu.tistory.com
'Problem Solving > Python' 카테고리의 다른 글
[백준]BOJ 1697 - 숨바꼭질 - Python/BFS (0) | 2022.11.07 |
---|---|
[백준]BOJ 2331 - 반복 수열 - Python/구현 (0) | 2022.11.07 |
[백준]BOJ 10451 - 순열 사이클 - Python (2) | 2022.11.06 |
[백준]BOJ 2178 - 미로 탐색 - Python/BFS (1) | 2022.11.06 |
[백준]BOJ 1260 - DFS와 BFS - Python/BFS, DFS (0) | 2022.11.06 |
댓글