250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- dynamic programming
- 자료구조
- 그래프 이론
- classification
- 백준
- 딥러닝
- 인공지능
- BFS
- AlexNet
- Reinforcement Learning
- C++
- 머신러닝
- TD
- edge detection
- machine learning
- exists
- DP
- image processing
- Python
- sklearn
- SIFT
- dfs
- opencv
- 강화학습
- Mask Processing
- canny edge detection
- MinHeap
- IN
- clustering
- MySQL
Archives
- Today
- Total
JINWOOJUNG
[ 그래프 이론 - 4963 ] 섬의 개수(Python) 본문
728x90
반응형
접근법
기존의 dfs에서 대각선을 탐색하는 경우의 수를 추가해 줘야 하며, "0 0"을 입력받기 전까지 반복해야 함으로 반복할 때 마다 전체 그래프와 cnt를 초기화 해 줘야 한다. 따라서 dfs()의 parameter에 전체 그래프도 추가되어야 한다.
정답
import sys
sys.setrecursionlimit(10**6)
di = [0,0,-1,1,1,1,-1,-1]
dj = [1,-1,0,0,1,-1,1,-1]
def dfs(i, j, Map):
Map[i][j] = 0
for k in range(8):
I = i+di[k]
J = j+dj[k]
if 0 <= I < h and 0 <= J < w:
if Map[I][J] ==1:
dfs(I,J,Map)
while(True):
w, h = map(int,sys.stdin.readline().split())
if w == 0 and h == 0:
break
Map = []
cnt = 0
for _ in range(h):
Map.append(list(map(int,sys.stdin.readline().split(" "))))
for i in range(h):
for j in range(w):
if Map[i][j] == 1:
cnt+=1
dfs(i,j,Map)
print(cnt)
di와 dj에서 그래프 특정 노드에서 움직이는 방향을 대각선 요소도 추가해 줌으로써 경우의 수가 8가지가 된다. 따라서 dfs() 내에서 각 경우마다 유효한 이동범위 내에서 섬인지 바다인지를 방문 여부를 통해 확인한다.
이전에는 노드간의 연결이였지만, 이번에는 노드간의 연결이라기 보다는 모든 그래프의 위치가 연결되어 있고 1인 경우가 땅이기 때문에 방문여부를 1인지 아닌지로 구분 해 준다면 유사하게 해결할 수 있다.
728x90
반응형
'백준' 카테고리의 다른 글
[ 그래프 이론-11403 ] 경로 찾기(Python) (1) | 2024.01.05 |
---|---|
[ 그래프 이론-11725 ] 트리의 부모 찾기(Python) (1) | 2024.01.04 |
[ 그래프 이론-11724 ] 연결 요소의 개수(Python) (1) | 2024.01.02 |
[ 그래프 이론-2468 ] 안전 영역(Python) (1) | 2024.01.02 |
[ 그래프 이론-2668 ] 숫자고르기(Python) (0) | 2023.12.30 |