https://www.acmicpc.net/problem/17071
N, K = map(int, input().split())
time = 1
move = [0] * 500001
points = {N}
if N != K:
while K < 500001:
# 수빈 움직임 추가
n_points = set()
for subin in points:
for nxt in (subin-1, subin+1, subin*2):
if -1 < nxt < 500001:
move[nxt] = time
n_points.add(nxt)
points = n_points
# 동생 움직이고 잡혔는지 판단
K += time
if K < 500001 and time == move[K]:
break
time += 1
else:
time = 0
if K < 500001:
print(time)
else:
print(-1)
https://dongchans.github.io/2019/53/
위 블로그의 해결방법 2번 참고
- 매 초마다 수빈이 방문할 수 있는 곳 체크
- 방문 한 적 없는 경우 현재 시간 저장. 현재 시간이 짝수인지 홀수인지에 따라 구분해서 저장(+1 -1로 다시 방문할 수 있기 때문에 최소시간만 저장)
- 수빈이가 이전에 이곳을 방문한 적이 있다면 동생 잡을 수 있는 것!
N, K = map(int, input().split())
time = 1
move = [[-1, -1] for _ in range(500001)] # 방문 시, 짝수, 홀수 최소 시간 저장
move[N][0] = 0
points = set([N])
if N != K:
while K < 500001:
# 수빈 움직임 추가
n_points = set()
for subin in points:
for nxt in (subin-1, subin+1, subin*2):
if -1 < nxt < 500001:
flag = time % 2
if move[nxt][flag] < 0:
move[nxt][flag] = time
n_points.add(nxt)
points = n_points
# 동생 움직이고 잡혔는지 판단
K += time
if K < 500001:
flag = time % 2
# 현재 시간에 동생 잡을 수 있는지 판단
if move[K][flag] > -1:
break
time += 1
else:
time = 0
if K < 500001:
print(time)
else:
print(-1)