문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
2
예제 입력 2 복사
4
예제 출력 2 복사
4
예제 입력 3 복사
6
예제 출력 3 복사
5
복기
1. 코테준비는 꾸준히 안하면 진짜 감다뒤네.. 하루에 1문제씩이라도 풀려고 노력 !
2. 조건이 3개가 있어서 어떻게 처리해야 하나 고민하고 못 풀었다. BFS가 최단 경로를 보장하기 때문에, 3개 조건을 리스트에 넣고 계속 돌리는 방식으로 풀면 된다고 한다.
3.
솔루션
from collections import deque
S = int(input())
q = deque()
q.append((1,0)) # (화면에 존재하는 이모티콘 수, 클립보드에 저장된 이모티콘 수)
visited = [[0]* 1001 for _ in range(1001)]
while q:
x_screen, x_clip = q.popleft()
if x_screen == S:
ans = visited[x_screen][x_clip]
break
arr = [
(x_screen, x_screen),
(x_screen+x_clip, x_clip),
(x_screen-1,x_clip)
]
for screen, clip in arr:
if 0<=screen<1001 and 0<=clip<1001 and not visited[screen][clip]:
q.append((screen,clip)) # 조건 진행.
visited[screen][clip] = visited[x_screen][x_clip]+1 # 조건이 진행되면 시간 1초 추가
print(ans)
댓글