이번 문제는 BFS를 통해 해결하였다. 클립으로 복사하는 연산, 클립을 화면에 추가하는 연산, 화면의 이모티콘 하나를 지우는 연산을 가독성을 위해 함수로 정의하였고, 방문처리는 2차원 리스트를 사용하여 [화면의 이모티콘수][클립의 이모티콘수]로 활용하였다. 범위를 벗어나지 않도록 다음 화면과 클립의 이모티콘 수를 0에서 1000까지로 제한하도록 하였고, 이와 같은 방법으로 BFS를 구현하여 해결하였다.
from collections import deque
s = int(input())
def copy_to_clip(cur, clip):
clip = cur
return cur, clip
def add_to_cur(cur, clip):
cur += clip
return cur, clip
def delete_cur(cur, clip):
cur -= 1
return cur, clip
def bfs():
q = deque()
q.append((1, 0, 0))
visited = [[False for _ in range(1001)] for _ in range(1001)]
visited[1][0] = True
while q:
cur, clip, time = q.popleft()
if cur > 1000 or cur < 0:
continue
if cur == s:
return time
nxt_cur, nxt_clip = copy_to_clip(cur, clip)
if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
visited[nxt_cur][nxt_clip] = True
q.append((nxt_cur, nxt_clip, time+1))
nxt_cur, nxt_clip = add_to_cur(cur, clip)
if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
visited[nxt_cur][nxt_clip] = True
q.append((nxt_cur, nxt_clip, time+1))
nxt_cur, nxt_clip = delete_cur(cur, clip)
if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
visited[nxt_cur][nxt_clip] = True
q.append((nxt_cur, nxt_clip, time+1))
print(bfs())