[백준] 14226. 이모티콘(Python, 파이썬)
백준 온라인의 문제 풀이입니다.
📖 [백준] 14226. 이모티콘
시간 제한 | 메모리 제한 | 난이도 |
---|---|---|
2초 | 512 MB | 골드 4 |
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
✔️ 입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
✔️ 출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
✔️ 입력 출력 예시
입력 | 출력 |
---|---|
2 | 2 |
4 | 4 |
6 | 5 |
18 | 8 |
🗒️ 내 풀이
경우의 수 중에서 최단시간을 구하니 BFS로 해결할 수 있다.
처음에는 클립보드에 저장되어 있는 값을 q에 넣어 판단하려 하다보니 다양한 경우를 판단하기가 어려웠는데, 2차원 배열으로 간단하게 해결할 수 있었다.
dist[x][c]의 의미는 x개의 이모티콘이 입력되어 있고, 클립보드에 c개의 이모티콘이 있을 때의 최소 시간이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
from collections import deque
input = sys.stdin.readline
INF = 1e6
s = int(input())
q = deque([(1, 0)])
dist = [[INF] * (s + 1) for _ in range(s + 1)]
dist[1][0] = 0
while q:
x, c = q.popleft()
# 1. copy
if dist[x][x] == INF: # 방문하지 않았으면
dist[x][x] = dist[x][c] + 1
q.append((x, x))
# 2. paste
if x + c <= s and dist[x + c][c] == INF:
dist[x + c][c] = dist[x][c] + 1
q.append((x + c, c))
# 3. minus 1
if x - 1 > 0 and dist[x - 1][c] == INF:
dist[x - 1][c] = dist[x][c] + 1
q.append((x - 1, c))
print(min(dist[s]))
💡 TIL
2차원 배열을 잘 활용하자!!
This post is licensed under CC BY 4.0 by the author.