프로그래머의 개발노트

[백준 4963] 섬의 개수 (python) 본문

백준 알고리즘

[백준 4963] 섬의 개수 (python)

7ULY 2020. 5. 12. 20:31

https://www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

문제 정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오. 한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사

www.acmicpc.net

처음에 이 문제를 접했을때 dfs를 사용하려 마음 먹었다. 

 

1. 스택에 정점의 인덱스 값을 넣고 visit_check 함수에 들어간다.

2. 스택에 값을 팝하면서 변수 i,j에 정점의 인덱스를 저장한다.

3. i,j의 값이 리스트 범위를 넘어가는 곳이거나, 방문했던 곳이면 해당 값을 버리고 스택에서 다시 값을 꺼낸다.

4. 스택의 값이 모두 비었다면 다시 돌아와서 isl 변수에 1을 더한다. 처음 스택에 넣었던 정점으로 부터 만들어진 섬이 하나 생긴 것이다.

5. 1부터 반복해서 섬의 갯수를 구한다.

 

 

 

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
52
53
import sys
from collections import deque
 
def dfs(stack,li,visited):
    while stack:
        tmp = stack.pop()
        i = tmp[0]
        j = tmp[1]
        if i < 0 or j < 0 or i > len(li)-1 or j > len(li[0])-1:
            continue
        if li[i][j] == 0 or visited[i][j]:
            continue
 
        visited[i][j] = 1
 
        stack.append([i-1,j])
        stack.append([i-1,j+1])
        stack.append([i,j+1])
        stack.append([i+1,j+1])
        stack.append([i+1,j])
        stack.append([i+1,j-1])
        stack.append([i,j-1])
        stack.append([i-1,j-1])
 
 
stack = deque()
island = []
while True:
    a, b = map(int, sys.stdin.readline().split())
    if a == 0 and b == 0:
        break
    li = []
    for _ in range(b):
        li.append(list(map(int, sys.stdin.readline().split())))
    visited = []
    for i in range(len(li)):
        tmp = [0 for j in range(len(li[0]))]
        visited.append(tmp)
    isl = 0
 
    for i in range(len(li)):
        for j in range(len(li[0])):
            if visited[i][j] == 1:
                continue
            if li[i][j] == 0:
                continue
            stack.append([i,j])
            dfs(stack,li,visited)
            isl+=1
    island.append(isl)
 
for i in range(len(island)):
    print(island[i])
cs

'백준 알고리즘' 카테고리의 다른 글

[백준 1348] 주차장 (C++)  (0) 2021.01.17
[백준 2585] 경비행기 (C++)  (0) 2021.01.17
[백준 9202] boggle (C++)  (0) 2021.01.17
[백준 1068] 트리 (python)  (0) 2020.07.05
[백준 2217] 로프 (python)  (1) 2020.05.14
Comments