티스토리 뷰
https://www.acmicpc.net/problem/14226
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
코드
import sys
from collections import deque
s = int(sys.stdin.readline())
arr = [[-1] * (s + 1) for _ in range(s + 1)]
def bfs():
queue = deque()
queue.append([1, 0])
arr[1][0] = 0
while queue:
x, y = queue.popleft()
if arr[x][x] == -1:
arr[x][x] = arr[x][y] + 1
queue.append([x, x])
if x + y <= s and arr[x + y][y] == -1:
arr[x + y][y] = arr[x][y] + 1
queue.append([x + y, y])
if x - 1 >= 0 and arr[x - 1][y] == -1:
arr[x - 1][y] = arr[x][y] + 1
queue.append([x - 1, y])
bfs()
result = arr[s][1]
for i in range(1, s):
if arr[s][i] != -1:
result = min(result, arr[s][i])
sys.stdout.write(str(result))
이차원 배열을 만들어 하나의 요소를 현재 이모티콘의 갯수, 나머지 하나를 클립보드에 저장된 이모티콘의 갯수를 저장한다. if문이 각각 연산 중 하나이고 1씩 더해주며 시간을 계산해 최솟값을 구하고 출력한다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 1261 파이썬 - 알고스팟 (0) | 2022.01.20 |
---|---|
백준 13549 파이썬 - 숨바꼭질 3 (0) | 2022.01.20 |
백준 13913 파이썬 - 숨바꼭질4 (0) | 2022.01.19 |
백준 1697 파이썬 - 숨바꼭질 (0) | 2022.01.19 |
백준 2146 파이썬 - 다리 만들기 (0) | 2022.01.19 |