백준 13913 숨바꼭질4
- CS/BOJ
- 2022. 2. 19.
숨바꼭질3에서 경로를 출력해야하는 문제다.경로를 출력하는 방법은 여러가지가 있다.
- que에 경로를 함께 기억한다.
- 경로 배열을 만들고, 각 배열에 올 수 있는 가장 빠른 경로를 업데이트 한다
이렇게 할 경우, 2번은 메모리 초과가 발생했다. 따라서 1번 방법으로 접근했다.
1번 방법으로 접근했을 때, 모든 경로를 숫자로 직접 입력해두었을 때 간단한 연산임에도 불구하고 어마어마한 시간이 필요했다. 돌이켜보면 10만개를 다 돌릴 수도 있는데, 10만개에 대한 주소를 모두 Path로 가지고 있다면 그 String을 넘겨주는 것과 메모리는 장난이 아닐꺼다.
"100000 99999 99998 ... 1... 이렇게 온다고 생각해보면 말이다. " 문자열이 어마어마하게기니 문자열 덧셈을 할 때 어마어마한 시간이 걸릴 수 밖에 없다. 물론 저렇게 하더라도 통과는 되지만 0.6초나 소요된다.
5개월 전에 나는 500ms에 풀었는데, 이번에는 6000ms가 걸렸다. 위 문자열을 좀 더 줄이는 방법을 고민해봤는데, 결국은 +, -, *만 잘 남겨두면 된다. 그리고 마지막 좌표를 기준으로 +,-,* 현재의 위치를 표현하고 마지막에 일괄적으로 출력할 수 있다.
import sys
from collections import deque
def sol(n,k):
que = deque()
que.append((n,0,""))
v[n] = 0
while que :
now_posi, time, path = que.popleft()
if now_posi == k :
print(time)
return path
next_time = time + 1
if now_posi + 1 <= 100000 and v[now_posi + 1] > next_time :
v[now_posi + 1] = next_time
que.append((now_posi + 1 , next_time, path + "+"))
if now_posi - 1 >= 0 and v[now_posi -1] > next_time :
v[now_posi - 1] = next_time
que.append((now_posi -1 , next_time, path + "-"))
if now_posi * 2 <= 100000 and v[now_posi * 2] > next_time :
v[now_posi * 2 ] = next_time
que.append((now_posi * 2 , next_time, path + "*"))
n,k = map(int,sys.stdin.readline().split())
v = [9876543210 for _ in range(100000 + 1 )]
if n == k :
print(0)
print(n)
else :
myStr = sol(n, k)
my_list = [n]
for s in myStr:
if s == "+":
my_list.append(my_list[-1] + 1)
elif s == "-":
my_list.append(my_list[-1] - 1 )
elif s == "*":
my_list.append(my_list[-1] * 2 )
print(" ".join(map(str, my_list)))
'CS > BOJ' 카테고리의 다른 글
백준 17071 숨바꼭질5 파이썬 (0) | 2022.02.21 |
---|---|
백준 20922 겹치는 건 싫어 파이썬 (0) | 2022.02.21 |
백준 13549 파이썬 (0) | 2022.02.19 |
백준 1707 이분그래프 파이썬 (0) | 2022.02.19 |
백준 2638 치즈 파이썬 (0) | 2022.02.19 |