Algorithm/DFS&BFS
[Python] 백준 2667번 : 단지번호붙이기 (S1) - DFS&BFS단계별3
supremo7
2021. 2. 1. 13:31
#문제
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
#풀이 & 학습한 내용
"2차원 배열을 그래프로 표현해 BFS나 DFS로 순회하는 문제"입니다. 2차원 배열을 그래프로 생각해서 DFS를 수행해 문제를 해결했습니다. 이때, 방향을 처음에 리스트로 설정해줘서 for문으로 편하게 접근할 수 있었습니다. BFS로 구현한다면, (x,y)인 튜플형태로 큐에 넣어줘야 할 것입니다.
#소스코드
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
|
dx=[0,0,-1,1]
dy=[-1,1,0,0] #★for문으로 접근하기 위해 방향을 리스트로 선언
village_num=0; #총 단지수
houses = [] #input으로 들어오는 집들 위치를 저장하는 2차원 리스트
village_house_num=[] #각 단지내 집의 수를 저장하는 리스트
count=0 #한 단지안에서 집의 수
#★DFS 구현
def village(i,j):
global count
visited[i][j]=1
count+=1
for k in range(4):
x = i+dx[k]
y = j+dy[k] #★for문으로 방향 받기
if 0<=x<N and 0<=y<N and houses[x][y]==1 and visited[x][y]==0:
visited[x][y]=1
village(x,y) #재귀호출
N = int(input())
visited = [[0]*N for _ in range(N)] #N*N 배열을 0으로 초기화
for i in range(N):
houses_input = [int(i) for i in list(input())]
houses.append(houses_input)
for i in range(N):
for j in range(N):
if houses[i][j]==1 and visited[i][j]==0:
village_num+=1
count=0
village(i,j)
village_house_num.append(count)
print(village_num)
village_house_num.sort() #각 단지내 집의 수 오름차순 정렬
for v in village_house_num:
print(v)
|
cs |
github.com/HoYoungChun/Algorithm_PS/blob/master/DFS%26BFS/BOJ_2667.py
HoYoungChun/Algorithm_PS
Baekjoon Online Judge, Programmers problem solving by Python, C++ - HoYoungChun/Algorithm_PS
github.com