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
- 스프링 컨테이너
- 어플리케이션 클래스 로더
- 부트스트랩 클래스 로더
- 파이썬 리스트 메서드
- 스프링
- python list method
- stop the world
- 파이썬
- Spring
- 코딩테스트
- 심볼릭 레퍼런스
- 자료구조
- 파이썬 문자열 메서드
- aws saa-c03
- python
- AWS SAA-C03 합격후기
- dfs
- 객체지향
- 딕셔너리
- java
- BFS
- getreference
- 백준
- 2026 AWS SAA-C03
- 클래스 로더 계층
- 알고리즘
- 플랫폼 클래스 로더
- 자바
- 다이렉트 레퍼런스
- 컴포넌트 스캔
Archives
- Today
- Total
클라우드 낚시꾼
[백준] 4963번 섬의 개수 - BFS 풀이 (Python3) 본문
728x90

제한 조건과 설계
1. W와 H는 50보다 작다. -> MAX 2500 그래프
2. DFS로 2000번 이상 탐색 시 Recursion Error 발생될 수 있기에 BFS 선택
3. 시간 제한 1초, 메모리 제한 128MB -> 엄격한 제한이므로 Queue 방문 처리 필수
자연어 알고리즘과 코드
1. 그래프 입력을 받는다.
2. 그래프를 BFS로 탐색한다.
- 탐색 지점이 0 이면 -> continue
- 탐색 지점이 1 이면 -> 그 지점을 시작 지점으로 삼아 queue에 enqueue하고 BFS 탐색을 시작
- land를 1증가시킨다. Queue에서 dequeue 한다.
- for문을 이용해 dequeue 된 지점에서 상,하,좌,우 + 왼쪽 위 대각선, 왼쪽 아래 대각선, 오른쪽 위 대각선, 오른쪽 아래 대각선으로 이동한다.
- 이동한 지점의 값이 그래프 범위 밖이면 -> continue
- 이동한 지점의 값이 0(바다)이면 -> continue
- 이동한 지점의 값이 1(육지)이면 -> 그 지점을 queue에 넣고 0으로 방문 처리한다.
- qeueue가 빌 때까지 위의 과정을 반복
3. 2번을 마치고 land를 리턴한 후 land를 출력한다.
4. 0이 입력 될 때 까지 위의 과정을 1~3 과정을 반복한다.
import sys
from collections import deque
input = sys.stdin.readline
def bfs(len_w, len_h, graph):
queue = deque()
# 상,하,좌,우 + 왼쪽 위 대각선, 왼쪽 아래 대각선, 오른쪽 위 대각선, 오른쪽 아래 대각선
dh = [-1,1,0,0] + [-1,1,-1,1]
dw = [0,0,-1,1] + [-1,-1,1,1]
land = 0
for i in range(len_h):
for j in range(len_w):
if graph[i][j] == 1:
land += 1
queue = deque()
queue.append((j,i)) # w,h
while queue:
w,h = queue.popleft()
for k in range(8):
nh = h + dh[k]
nw = w + dw[k]
if nw < 0 or nh < 0 or nw >= len_w or nh >= len_h:
continue
if graph[nh][nw] == 0:
continue
queue.append((nw,nh))
graph[nh][nw] = 0
return land
while True:
w,h = map(int, input().split())
graph = []
if w == 0 and h == 0:
break
for i in range(h):
graph.append(list(map(int, input().split())))
print(bfs(w,h,graph))
세 줄 요약
- 상, 하, 좌, 우 이동에서 대각선 이동까지 확장한 문제.
- w,h로 받았으면 쭉 w,h 순으로 다루자(append, popleft 등 할때).
- graph만 graph[h][w]로 다루면 된다.
(방문 처리 잘 했군.. ㅋㅋ)
728x90
'CodingTest > 문제풀이' 카테고리의 다른 글
| [백준] 13023번 ABCDE - DFS 풀이 + 반례 (Python3) (0) | 2023.12.27 |
|---|---|
| [백준] 11724번 연결 요소의 개수 - DFS(stack, 재귀함수) (Python3) (0) | 2023.12.27 |
| [백준] 1012번 유기농 배추 - BFS 풀이(Python3) (0) | 2023.12.24 |
| [백준] 16956번 늑대와 양 - Python3 (애드 혹 문제, 이 문제가 정말 BFS 문제 일까?) (1) | 2023.12.24 |
| [백준] 2667번 단지번호붙이기 DFS - Python3 (1) | 2023.12.21 |