728x90
#13913번 숨바꼭질4 https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
이 전에 풀었던 숨바꼭질 문제(https://www.acmicpc.net/problem/1697)에서
단순히 거리만을 저장하는게 아니라 경로를 저장하는 형태로 코드를 변경했다.
N, T = map(int, input().split())
M = 10**5
dist = [[]]*(M+1)
dist[N] = [N]
def solve(position):
que = []
que.append(position)
while que:
p = que.pop(0)
if p == T:
print(len(dist[p])-1)
for i in dist[p]:
print(i, end=" ")
return dist[p]
for np in [p-1, p+1, p*2]:
if 0 <= np <= M and not dist[np]:
dist[np] = dist[p] + [np]
que.append(np)
solve(N)
결과는 메모리 초과.
그럴만도하다... 10**5개의 리스트에 리스트를 저장하는 형태니까..
그래서 백준 질문을 뒤져보았고 대안을 얻었다.
2진수를 사용하는 방법도 있다고 하지만 번거로워보여서 패스
딕셔너리를 이용하는 방법을 선택했다.
N, T = map(int, input().split())
M = 10**5
dist = {}
def solve(position):
que = []
que.append(position)
while que:
p = que.pop(0)
if p == T:
return p
for np in [p-1, p+1, p*2]:
if 0 <= np <= M and np not in dist.keys():
dist[np] = p
que.append(np)
last = solve(N)
answer = []
while last != N:
answer.append(last)
last = dist[last]
answer.append(last)
print(len(answer)-1)
print(" ".join(map(str, answer[::-1])))
이전 위치만 기록하는 형태이다.
45 : 43 형태로 저장된다면 45로 가기 전 위치는 43이라는 뜻이다.
굉장히 현명한 방법이라고 생각했다.
저런 생각 하는 사람들이 플레티넘 가는거구나...
'Algorithm > acmicpc.net' 카테고리의 다른 글
모자란건 고민하는 시간인가 재능인가 (0) | 2022.02.04 |
---|---|
BFS의 충분조건? : 모든 엣지의 가중치가 동일할 것. (0) | 2022.02.01 |
골드 4인데도 막힌... (0) | 2022.01.28 |
왜 점점 멍청해지는 기분이..? (0) | 2022.01.27 |
넘쳐나는 아이디어 그리고 떨어지는 구현능력 (0) | 2022.01.26 |