Skip to content

Commit 009301f

Browse files
committed
2 parents 5d733f3 + bb013a4 commit 009301f

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

Hongjoo/백준/숨바꼭질3.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,44 @@
1+
"""
2+
https://www.acmicpc.net/problem/13549
3+
4+
[BOJ] 숨바꼭질3/골드5/
5+
#promblem
6+
- 이동 방법[t, x] -> [t+1 , x-1] ,[t+1 , x+1] # 걷기/ ``[t , 2*x]``
7+
#flow : BFS (최단 시간 x , 최단 동작 횟수) or DFS
8+
1. node= [현 위치 x , 현 시간 t]
9+
2.이웃한 node - x+1 , x-1 , 2*x
10+
(if , nx = 2*x -> t else :걷기 -> t+1)
11+
IDEA
12+
- 같은 level -> 이동(걷기+ 순간이동) 횟수 동일함
13+
- 궁극적으로 최단 시간 = 최단 경로 , 순간이동을 가장 많이 해야함 (순간이동 우선순위가 높음)
14+
=> 2*x -> x-1, x+1 순으로 다음 node 탐색하기
15+
-> 중복되지만 순간이동으로 도달한 경우 vs 걸어서 도달한 경우를 비교할 때,
16+
"""
17+
18+
import sys
19+
from collections import deque
20+
input = sys.stdin.readline
21+
MAX = 100001
22+
N , K = map(int, input().split())
23+
visited = [MAX] * (MAX+1) # 방문 여부
24+
# 2. BFS로 N-> K 의 모든 경로 찾기
25+
q = deque([N])
26+
visited[N]= 0
27+
28+
while q :
29+
cx= q.popleft()
30+
ct = visited[cx]
31+
if cx == K:
32+
break
33+
for nx in (2*cx , cx-1 , cx+1 ) :
34+
if 0 <= nx < MAX and visited[nx] >= MAX : # nx 의 제한 조건
35+
# 시간 업데이트
36+
if nx == 2*cx :
37+
visited[nx] = visited[cx]
38+
else :
39+
visited[nx] = visited[cx] +1
40+
q.append(nx)
41+
print(visited[K])
142
import sys
243
from collections import deque
344
input = sys.stdin.readline

Hongjoo/백준/숨바꼭질4.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
N, K = map(int, input().split())
5+
MAX = 100001
6+
# answer = []
7+
#[1] 최단 시간 찾기
8+
visited = [[MAX, MAX] for _ in range(MAX+1)]# level 기입
9+
10+
t= 0
11+
next_node = [N]
12+
q = deque([N])
13+
visited[N] = [t,N] # 도착 시간 , 이전 node 위치 확인
14+
15+
#(예외처리) 출발지 = 도착지 같은 경우
16+
if K != N :
17+
while q :
18+
t+=1
19+
next_node = len(q)
20+
for i in range(next_node) : # 현재 level의 node개수만큼 반복
21+
cx = q.popleft()
22+
# print(f"cx {cx} , {next_node}")
23+
# 만약 목적 달성시 , 끝
24+
for nx in [cx -1 , cx+1 , cx*2]:
25+
if 0<= nx <= MAX and visited[nx][0]>= MAX :
26+
q.append(nx)
27+
visited[nx] = [t, cx]
28+
# 현재 q -> 다음 level 의 노드만 남아있는 상태
29+
# 만약 K을 도달한 경우-> 최단 시간 저장
30+
if visited[K][0]< MAX :
31+
break
32+
print(t)
33+
#[2] 역추적 - 최단 시간 경우 , 경로 추적
34+
re_visited = [K]
35+
pt = K
36+
while pt != N :
37+
_ , pt =visited[pt]
38+
re_visited.append(pt)
39+
40+
print(" ".join(map(str,list(reversed(re_visited)))))
41+

Hongjoo/백준/숨박꼭질3.py

Whitespace-only changes.

0 commit comments

Comments
 (0)