IT/ps
백준 14226번 이모티콘
u149_cinderella
2025. 2. 11. 20:11
간단하게 생각해서 클릅보드의 개수를 저장해주자 비용도 저장하고
from collections import deque
import sys
n=int(sys.stdin.readline().rstrip())
v=[-1]*2001
def bfs():
q=deque()
q.append([1,0,0])
v[1]=0
while q:
cur_v,clip,cost=q.popleft()
for i in range(3):
move_v=0
cur_cost=cost
cur_clip=clip
if i==0:
if clip==0:
continue
move_v=cur_v+clip
cur_cost+=1
elif i==1:
cur_clip=cur_v
move_v=cur_v
cur_cost+=1
if cur_clip!=clip:
q.append([move_v,cur_clip,cur_cost])
continue
else:
move_v=cur_v-1
cur_cost+=1
if move_v>2000 or move_v<0:
continue
if v[move_v]==-1 or v[move_v]>cur_cost:
v[move_v]=cur_cost
q.append([move_v,cur_clip,cur_cost])
bfs()
print(v[n])
이렇게 1차원배열로 별짓을 다해봤지만 풀리지않는다
뭔가 될거같긴한데
from collections import deque
import sys
n=int(sys.stdin.readline().rstrip())
q=deque()
visited=[[-1]*2001 for _ in range(2001)]
q.append([1,0])
visited[1][0]=0
is_end=False
while q:
cur_v,clip=q.popleft()
for i in range(3):
move_v=cur_v
move_clip=clip
if i==0:
move_clip=move_v
elif i==1:
move_v+=move_clip
elif i==2:
move_v-=1
if move_v<0 or move_v>2000:
continue
if move_v==n:
print(visited[cur_v][clip]+1)
is_end=True
break
if visited[move_v][move_clip]==-1:
q.append([move_v,move_clip])
visited[move_v][move_clip]=visited[cur_v][clip]+1
if is_end:
break
모르겠어서 정답을 한번 봤다
1차원으로 풀지 못하는 이유는 동일한 화면개수에 다른 클립보드 개수일때가 문제가 되는것이다.
중요한점은 내가 큐에 집어넣었을때 클립보드 복사일때만 큐에 넣고있는데
그렇게 되면 놓치는 경로가 생기는게 문제였다.
클립보드번호도 저장하지 않으면 풀수가 없는 문제였다.
정확히는 큐에 넣는 조건이 코스트가 적을때 넣는건데 이렇게 되면 손실되는 클립이 생긴다.