일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 트리
- ACM Craft
- 백준 2217
- BOGGLE
- 42서울 라피신 후기
- 백준 1003
- 백준 2585
- 백준 피보나치 함수
- 백준 1068
- 라피신 후기
- 백준 낚시왕
- 라피씬
- 백준 주차장
- 피보나치 함수
- 백준 로프
- 42서울 후기
- 백준 17143
- 백준 1348
- 백준 경비행기
- 백준
- 백준 #백준4963 #섬의 개수
- C++
- 백준 boggle
- 42서울
- 백준 9095
- 백준 9202
- 라피신
- 백준 1463
- 백준 1로 만들기
- 백준 1005
Archives
프로그래머의 개발노트
[백준 4963] 섬의 개수 (python) 본문
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