문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제 입력과 출력
정답
from collections import deque
import sys
input = lambda :sys.stdin.readline().strip()
s=int(input())
ch=[[-1]*(s+1) for i in range(s+1)]
def bfs():
de=deque()
de.append([1,0])
ch[1][0]=0
while de:
x,y=de.popleft()
if ch[x][x] == -1: # 1번 연산
ch[x][x] = ch[x][y]+1
de.append([x,x])
if x+y <= s and ch[x+y][y] == -1 : # 2번 연산
ch[x+y][y] = ch[x][y]+1
de.append([x+y,y])
if x-1 >=0 and ch[x-1][y] == -1: # 3번 연산
ch[x-1][y] = ch[x][y]+1
de.append([x-1,y])
bfs()
r=ch[s][1]
for i in range(1,s):
if ch[s][i] != -1:
r=min(r,ch[s][i])
print(r)
이모티콘 1개에서 s개까지의 이모티콘을 화면에 만드는데 걸리는 최소 시간을 구하는 문제입니다.
bfs를 이용해 문제를 푸는데 ch를 이차원 배열로 만듭니다.
ch[화면에 나온 이모티콘 개수][클립보드의 이모티콘 개수]
bfs에서 1, 2, 3번 각각 연산의 경우를 실행합니다.
화면에 나온 이모티콘은 s개이고 클립보드의 이모티콘이 1부터 s-1개일때까지의 값을 비교해 가장 작은 값(최소 시간)을 출력합니다.
백준 알고리즘 14226번 : https://www.acmicpc.net/problem/14226
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
백준알고리즘 - 15988번 1, 2, 3 더하기 3 - 파이썬(Python) (0) | 2020.06.29 |
---|---|
백준알고리즘 - 13549번 숨바꼭질 3 - 파이썬(Python) (0) | 2020.06.28 |
백준알고리즘 - 13023번 ABCDE - 파이썬(Python) (0) | 2020.06.28 |
백준알고리즘 - 14500번 테트로미노 - 파이썬(Python) (0) | 2020.06.28 |
백준알고리즘 - 2573번 빙산 - 파이썬(Python) (0) | 2020.06.28 |