"숨바꼭질 3" 문제에서 간단한 역추적 코드만 넣어주면 되는 문제이다. backtbl에 경로를 저장하고 tracker라는 이름의
변수를 갱신하면서 경로를 저장하고, 저장된 경로를 출력해주면 된다. 나는 51퍼랑 86퍼에서 "틀렸습니다"를 받았는데, n=0인 경우랑 n=k=0인 경우의 예외 처리를 하지 않아서였다...
q={}
track={}
q.first,q.last=1,2
local MAX=100001
function pushFirst(value)
q.first=q.first-1
q[q.first]=value
end
function popFirst()
local value=q[q.first]
q[q.first]=nil
q.first=q.first+1
return value
end
n,k=io.read("*n","*n")
q[1]=n
check,dist={},{}
for i=0,MAX,1 do check[i]=0 dist[i]=0 end
dist[n]=0
while q.first~=q.last do
now=tonumber(popFirst())
if not now then
break
end
if 2*now<=MAX and check[now+now]==0 then
q[q.last]=2*now
q.last=q.last+1
check[2*now]=1
dist[2*now]=dist[now]+1
if track[2*now]==nil then track[2*now]=now end
end
if now>=1 and check[now-1]==0 then
q[q.last]=now-1
q.last=q.last+1
check[now-1]=1
dist[now-1]=dist[now]+1
if track[now-1]==nil then track[now-1]=now end
end
if now+1<=MAX and check[now+1]==0 then
q[q.last]=now+1
q.last=q.last+1
check[now+1]=1
dist[now+1]=dist[now]+1
if track[now+1]==nil then track[now+1]=now end
end
if now==k then break end
end
if n==k then dist[k]=0 end
tracker=k
backtbl={}
for i=1,dist[k] do backtbl[dist[k]+1-i]=tracker tracker=track[tracker] end
if n~=0 then
print(dist[k])
io.write(n," ")
for i=1,dist[k] do io.write(backtbl[i]," ") end
elseif k~=0 then
print(dist[k]-1)
io.write(n," ")
for i=2,dist[k] do io.write(backtbl[i]," ") end
else
print(0)
print(0)
end
'코딩 > Lua' 카테고리의 다른 글
[Lua] 백준 25419 정수를 끝까지 외치자 (0) | 2023.12.14 |
---|---|
[Lua] 백준 1826 연료 채우기 (2) | 2023.12.04 |
[Lua] 백준 27440 1로 만들기 3 (0) | 2023.02.19 |
[Lua] 백준 2003 수들의 합 2 (0) | 2023.01.07 |
[Lua] 백준 14852 타일 채우기 3 (0) | 2022.12.22 |