유형 : bfs
저번 문제에 이어서 2010 한국정보올림피아드 초등부 문제이다.
문제풀이
bfs(Floodfill) 알고리즘을 이용하여 섬의 개수를 찾는 문제이다.
1. 먼저 기준 높이를 정하고, 지역의 높이가 기준 높이보다 높다면 0 아니면 1이 되도록 visit 배열을 초기화한다.
2. (0,0)부터 visit[row][col]이 0인 값을 찾고 그 row, col 값을 기준으로 bfs를 한다. 여기서 방문되는 곳들이 1개의 영역을 형성한다.
3. 2의 과정을 기준높이가 1부터 (지역 높이의 최댓값)-1 까지 반복한다. (기준높이 = 지역높이의 최댓값 같은 경우의 영역의 개수는 0개일 것이므로)
Python Code
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
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import collections,sys
def bfs(r,c):
q=collections.deque()
q.append((r,c))
while q:
r,c = q.popleft()
if r>0 and visit[r-1][c] == 0:
q.append((r-1,c))
visit[r-1][c]=1
if r<n-1 and visit[r+1][c] == 0:
q.append((r+1,c))
visit[r+1][c] = 1
if c>0 and visit[r][c-1] == 0 :
q.append((r,c-1))
visit[r][c-1] = 1
if c<n-1 and visit[r][c+1] == 0:
q.append((r,c+1))
visit[r][c+1] = 1
def getArea(height):
global visit
visit = [[0 if maps[r][c] > height else 1 for c in range(n)] for r in range(n)]
area = 0
for r in range(n):
for c in range(n):
#print(r,c)
if visit[r][c] == 0 :
bfs(r,c)
area+=1
return area
def solution(maps,maxHeight):
ans = 0
for i in range(maxHeight):
temp = getArea(i)
if temp > ans:
ans = temp
print(ans)
if __name__=="__main__":
n = int(sys.stdin.readline())
maps = []
maxHeight = 0
for _ in range(n):
temp = list(map(int,sys.stdin.readline().split()))
tempMax = max(temp)
maps.append(temp)
if tempMax>maxHeight:
maxHeight = tempMax
solution(maps,maxHeight)
|
cs |
42 line ~ 에서 입력값을 받는다.
solution 함수에서 3의 과정을 진행한다.
bfs 함수는 말 그대로 과정 2의 bfs를 하는 과정이다.(한개의 영역을 찾는다.)
getArea 함수의 경우에는 visit 함수를 초기화하고 영역의 총 개수를 센다.
호출 순서는 아래에서부터가 된다. main(입력값을 받는다) > solution(기준 높이를 설정한다) > getArea(visit 배열을 초기화하고 영역의 총 개수를 센다) > bfs(각 지점을 포함하는 영역을 구한다)
시간복잡도는 O(N^2*최대높이)가 된다.
높이가 2인 경우, 높이가 1인 경우의 영역을 참고하면 시간복잡도를 더 줄일 수 있을 것이다. 지금의 풀이의 경우, 높이가 2인 경우, 높이가 1인 경우를 참고하지 않고 처음부터 풀이를 하게 된다.
문제링크
'알고리즘 > 백준' 카테고리의 다른 글
백준 1058 친구 (0) | 2020.03.19 |
---|---|
백준 2469 사다리 타기 (0) | 2020.03.19 |
백준 2467 용액 (0) | 2020.03.12 |
백준 1300 K번째 수 (0) | 2020.03.11 |
백준 17214 다항 함수의 적분 (0) | 2020.03.10 |