본문 바로가기
Problem Solving/Python

[백준]BOJ 2667 - 단지 번호 붙이기 - Python

by Kellang 2022. 11. 7.

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

 

댓글