잡히면 죽는다💙🚓
Q. 연인 코니와 브라운은 광활한 들판에서 ‘나 잡아 봐라’ 게임을 한다.
이 게임은 브라운이 코니를 잡거나, 코니가 너무 멀리 달아나면 끝난다.
게임이 끝나는데 걸리는 최소 시간을 구하시오.
조건은 다음과 같다.
- 코니는 처음 위치 C에서 1초 후 1만큼 움직이고, 이후에는 가속이 붙어 매 초마다 이전 이동 거리 + 1만큼 움직인다.
- 즉 시간에 따른 코니의 위치는 C, C + 1, C + 3, C + 6, …이다.
- 브라운은 현재 위치 B에서 다음 순간 B – 1, B + 1, 2 * B 중 하나로 움직일 수 있다.
- 코니와 브라운의 위치 p는 조건 0 <= x <= 200,000을 만족한다.
- 브라운은 범위를 벗어나는 위치로는 이동할 수 없고, 코니가 범위를 벗어나면 게임이 끝난다
c = 11 # 코니의 처음 위치
b = 2 # 브라운의 처음 위치
코니의 이동 경로
c = 11 // 코니의 초기 위치
c_v = 0 // 코니의 가속도
c_v = c_v + 1 // 가속도에 1을 더한다
c = c + c_v // 현재 코니의 거리에 가속도를 더한 값을 더한다
이렇게 코니의 이동 거리는 다음과 같이 계산할 수 있을 것이다.
브라운의 이동 경로
if b < c:
if abs(2 * b - c) < abs(b + 2 - c):
b = b * 2
else:
b = b + 2
elif b > c:
b = b - 1
def catch_me(c, b):
ans = 0
c_v = 0
while True:
if b == c or not 0 <= b <= 200000 or not 0 <= c <= 200000:
return ans
ans = ans + 1
c_v = c_v + 1
c = c + c_v
if b < c:
if abs(2 * b - c) < abs(b + 2 - c):
b = b * 2
else:
b = b + 1
elif b > c:
b = b - 1
# print("b, c, c_v, c_tot:", b, c, c_v, c_tot)
print("정답 = 3 / 현재 풀이 값 = ", catch_me(10, 3))
print("정답 = 8 / 현재 풀이 값 = ", catch_me(51, 50))
print("정답 = 28 / 현재 풀이 값 = ", catch_me(550, 500))
아
그렇다면...?
브라운의 이동 경로를 계산하는 알고리즘 설계
여기에서 중요한 포인트는 다음과 같다.
from collections import deque
def catch_me(c, b):
time = 0
queue = deque()
queue.append((b, 0))
visited = [{} for _ in range(200001)]
while c < 200000:
c += time
if time in visited[c]:
return time
for i in range(0, len(queue)):
cur_pos, cur_time = queue.popleft()
new_time = cur_time + 1
new_pos = cur_pos * 2
if new_pos < 200001 and new_time not in visited[new_pos]:
visited[new_pos][new_time] = True
queue.append((new_pos, new_time))
new_pos = cur_pos + 1
if new_pos < 200001 and new_time not in visited[new_pos]:
visited[new_pos][new_time] = True
queue.append((new_pos, new_time))
new_pos = cur_pos - 1
if new_pos >= 0 and new_time not in visited[new_pos]:
visited[new_pos][new_time] = True
queue.append((new_pos, new_time))
time += 1
print("정답 = 3 / 현재 풀이 값 = ", catch_me(10, 3))
print("정답 = 8 / 현재 풀이 값 = ", catch_me(51, 50))
print("정답 = 28 / 현재 풀이 값 = ", catch_me(550, 500))