[Baekjoon Online Judge] 백준 2667번 단지번호붙이기
(Python)
(글쓴날 : 2020.03.28)
* Baekjoon Online Judge, 백준 2667번 문제 Python 언어 풀이입니다.
* 소스 코드의 저작권은 글쓴이에게 있습니다.
백준 2667번 단지번호붙이기
1) 문제
문제 링크 : https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수
www.acmicpc.net
2) 풀이 과정
0과 1이 저장되어 있는 2차원 배열 안에서 1이 담긴 곳을 집으로 가정하고 집들이 상하좌우로 연결되어 있는 공간을 단지로 가정했을 때 총 단지의 개수와 각 단지들에 속한 집들의 개수를 출력하는 문제입니다.
저의 경우 BFS를 적용해 문제를 해결했으며, 별 특이할 것 없이 완전 탐색을 하다 1이 나오면 BFS를 통해 상하좌우로 연결되어 있는 모든 집들을 찾아주시면 되겠습니다.
3) 코드
* Python 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import sys, queue
input = sys.stdin.readline
def BFS(i, j):
global N, house, dx, dy, visit, district
count = 0
q = queue.Queue()
q.put((i, j))
while q.qsize():
x, y = q.get()
if visit[x][y] == False:
visit[x][y] = True
count += 1
for way in range(4):
ii, jj = x + dx[way], y + dy[way]
if ii < 0 or ii > N - 1 or jj < 0 or jj > N - 1:
continue
if house[ii][jj] == 1:
q.put((ii, jj))
district.append(count)
N = int(input())
house = [list(map(int, input().rstrip())) for _ in range(N)]
dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]
visit = [[False] * N for _ in range(N)]
district = []
for i in range(N):
for j in range(N):
if house[i][j] == 1 and visit[i][j] == False:
BFS(i, j)
print(len(district))
print(*(sorted(district)), sep="\n")
|
'Deprecated' 카테고리의 다른 글
[Baekjoon Online Judge] 백준 4963번 섬의 개수(Python) (0) | 2020.03.29 |
---|---|
[Baekjoon Online Judge] 백준 15649번 N과 M (1)(Python) (0) | 2020.03.28 |
[Baekjoon Online Judge] 백준 15686번 치킨 배달(Python) (0) | 2020.03.28 |
[Amazon Web Services] EC2 인스턴스에 PuTTY로 접속하는 법 (0) | 2020.03.27 |
[Baekjoon Online Judge] 백준 14889번 스타트와 링크(Python) (0) | 2020.03.27 |