2021. 9. 7. 21:08ㆍ알고리즘/다이나믹프로그래밍
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제 입력 1
2
예제 출력 1
2
예제 입력 2
4
예제 출력 2
4
예제 입력 3
6
예제 출력 3
5
예제 입력 4
18
예제 출력 4
8
접근 방법
- s x 2의 길이를 가지는 dp를 s+1로 초기화하고 dp[1]에는 1의 값을 저장한다. dp의 값은 스크린에 있는 이모티콘의 개수를 의미하고 처음은 화면에 있는 이모티콘을 복사하는 것을 가정한다.
- 세가지 연산을 진행할 때마다 큐에 [클립보드에 있는 이모티콘의 개수, 화면에 있는 이모티콘의 개수, 연산 시간]을 저장하여 이를 가지고 연산을 반복한다.
- 단, 큐에 값을 삽입할 때는 dp의 값보다 작은 경우만 삽입한다.
- 이때 화면에 있는 이모티콘의 개수가 s와 같다면 이를 종료하고 연산 시간을 출력한다.
코드
# https://www.acmicpc.net/problem/14226
# 접근 방법
# s x 2의 길이를 가지는 dp를 s+1로 초기화하고 dp[1]에는 1의 값을 저장한다. dp의 값은 스크린에 있는 이모티콘의 개수를 의미하고 처음은 화면에 있는 이모티콘을 복사하는 것을 가정한다.
# 세가지 연산을 진행할 때마다 큐에 [클립보드에 있는 이모티콘의 개수, 화면에 있는 이모티콘의 개수, 연산 시간]을 저장하여 이를 가지고 연산을 반복한다.
# 단, 큐에 값을 삽입할 때는 dp의 값보다 작은 경우만 삽입한다.
# 이때 화면에 있는 이모티콘의 개수가 s와 같다면 이를 종료하고 연산 시간을 출력한다.
from collections import deque
s = int(input())
dp = [s+1 for _ in range(s*2)]
dp[1] = 1
queue = deque([])
queue.append([1, 1, 1])
while queue:
clipboard, screen, time = queue.popleft()
if clipboard < screen < s:
queue.append([screen, screen, time+1])
if clipboard + screen < s*2:
dp[clipboard+screen] = min(time+1, dp[clipboard+screen])
queue.append([clipboard, clipboard+screen, time+1])
if screen - 1 > 0:
if dp[screen-1] >= time+1:
dp[screen-1] = time+1
queue.append([clipboard, screen-1, time+1])
# print(dp, queue)
if dp[s] != s+1:
print(dp[s])
break
'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글
백준 온라인 저지, 다이나믹프로그래밍 / 17619번: 개구리점프 (파이썬 / 백준 골드문제) (0) | 2021.09.09 |
---|---|
백준 온라인 저지, 다이나믹프로그래밍 / 13549번: 숨바꼭질 (파이썬 / 백준 골드문제) (0) | 2021.09.07 |
백준 온라인 저지, 다이나믹프로그래밍 / 2193번: 이친수 (파이썬) (0) | 2021.09.07 |
백준 온라인 저지, 다이나믹프로그래밍 / 1516번: 게임개발 (파이썬 / 백준 골드문제) (0) | 2021.09.05 |
백준 온라인 저지, 다이나믹프로그래밍 / 1915번: 가장큰정사각형 (파이썬 / 백준 골드문제) (0) | 2021.09.03 |