Notice
Recent Posts
Recent Comments
Link
Marryakirise's coding
[BFS,DFS] 백준 Sliver1 1697 숨바꼭질 본문
문제


설계 ✨
- 처음 수빈이의 위치 N 에서 동생의 위치 K로 가는 최단 시간을 찾는 것이다.
- 최단 시간을 찾는 것이기에 DFS, BFS를 먼저 생각할 수 있다.
- 기존 위치에서 이동하는 위치는 3가지 X - 1, X + 1, 2 x X 로 총 3가지가 있다. 즉 노드가 3개로 펼쳐져 나갈 수 있다.
- 하나의 노드가 얼마나 깊이까지 가는지 모두 확인해서 최단시간을 찾으려면 모든 경로를 다 탐색해야하므로 비효율적이다. 즉 DFS 보다는 BFS 임을 생각한다.
- BFS로 문제를 풀기로 했으니, 기존 BFS 코드를 작성한다.
- 다음 노드로 펼쳐져 가는 것이 3가지가 있으니 Queue에 append할 아이템이 3가지이다.
- X - 1, X + 1, 2 x X 값이 범위를 넘어가지 않도록 조건문을 사용해준다.
- 방문 위치를 표시하기 위한 방법을 생각해 Array 하나를 만들어 준다.
다음은 참고한 블로그 링크입니다.
핵심 자료구조 - 그래프 : 최단 경로 : ① : BFS, 다익스트라
BFS와 다익스트라 알고리즘을 통해서 그래프의 최단경로를 구하는 것에 대해서 알아봅시다.
velog.io
[Python] 백준 1697번 숨바꼭질 - 차근차근 문제접근
숨바꼭질 성공 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 147202 41776 26180 25.026% 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동
chancoding.tistory.com
import sys
from collections import deque
def bfs(v):
q = deque([v]) # 큐 선언
while q:
v = q.popleft()
if v == k: # 큐에서 꺼낸 노드가 k와 같을 때 (동생의 위치에 도착했을 때)
return array[v] # 값 리턴
for next_v in (v-1, v+1, 2*v): # -1만큼 이동, +1만큼 이동, *2만큼 순간이동할 수 있음
if 0 <= next_v < MAX and not array[next_v]: # 범위 조건 and 방문하지 않았을 때
# not array[i] -> array[i]가 0이면 실행
array[next_v] = array[v] + 1 # 이동할 때마다 1초가 소요되므로 누적해서 시간 쌓기
q.append(next_v) # queue에 이동한 위치 넣기
MAX = 100001 # 백준 범위
n, k = map(int,input().split())
array = [0] * MAX # 각 위치마다 몇 초 걸렸는지 담기 위한 리스트
print(bfs(n))'Algorithm > Baekjoon' 카테고리의 다른 글
| [Geometry] 백준 Gold5 11758번 CCW (0) | 2023.03.28 |
|---|---|
| [Deque] 백준 Gold5 5430 AC (0) | 2023.03.22 |
| [BFS, DFS] 프로그래머스 lv2. 타겟 넘버 (0) | 2023.02.14 |
| [Greedy] Sliver 2 A -> B (0) | 2023.01.18 |
| [Greedy,String] Sliver 2 1541 잃어버린 괄호 (0) | 2023.01.17 |
Comments