[백준] 14226 이모티콘 파이썬
문제
https://www.acmicpc.net/problem/14226
14226번: 이모티콘
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만
www.acmicpc.net
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
풀이
from collections import deque
#화면의 이모티콘, 클립보드 이모티콘, 시간
s = int(input())
dp = [-1]*1001
dp[1] = 0
q = deque([(1, 0, 0)])
while q:
print(q)
sc, clip, t = q.popleft()
if sc == s:
print(dp[s])
break
if sc != clip:
q.append((sc, sc, t+1))
if 2 <= sc+clip <= 1000 and dp[sc+clip] == -1:
dp[sc+clip] = t+1
q.append((sc+clip, clip, t+1))
if 2 <= sc-1 <= 1000 and dp[sc-1] == -1:
dp[sc-1] = t+1
q.append((sc-1, clip, t+1))
18개의 이모티콘을 화면에 넣는 데 어떻게 8번의 연산밖에 소요되지 않는지 이해 불가!
내 코드로는 11회가 최소라고 출력 됨
[백준] boj-14226 이모티콘 파이썬
[ 문제 ] https://www.acmicpc.net/problem/14226 [ 알고리즘 유형 ] 다이나믹 프로그래밍 그래프 이론 그래프 탐색 너비 우선 탐색 [ 정답 코드 ] [ 풀이 방법 ] 걸리는 시간의 최솟값을 구한다. 즉, 최단시간
velog.io
이분 코드를 뜯어보며 8회 안에 18개의 이모티콘을 출력하는 경로를 보려고 함
from collections import deque
s = int(input())
dp = [[-1]*(1001) for _ in range(1001)]
dp[1][0] = 0
#화면의 이모티콘, 클립보드 이모티콘
q = deque([(1, 0)])
while q:
sc, clip = q.popleft()
if sc == s:
print(dp[s][clip])
break
if dp[sc][sc] == -1:
dp[sc][sc] = dp[sc][clip]+1
q.append((sc, sc))
if 2 <= sc+clip <= 1000 and dp[sc+clip][clip] == -1:
dp[sc+clip][clip] = dp[sc][clip]+1
q.append((sc+clip, clip))
if 2 <= sc-1 <= 1000 and dp[sc-1][clip] == -1:
dp[sc-1][clip] = dp[sc][clip]+1
q.append((sc-1, clip))
반례에 대해 알아보려다가 그냥 남들처럼 screen, clipboard 둘 다를 기준으로 기록했더니 통과했다.
클립보드에 복사하는 부분에서 반례가 있는 것 같다.