▶14226 - 이모티
▶문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여 넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여 넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여 넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는 데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
▶입력
첫째 줄에 S (2 ≤ S ≤ 1000)가 주어진다.
▶출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
▶풀이
bfs만 사용해도 충분히 풀 수 있는 문제이다.
단, visit를 판단해 줄 때 보통은 1차원으로 했지만 이번에는 2차원 배열을 사용해야 한다.
화면에 있는 개수를 s, 클립보드에 있는 개수를 clip, 시간을 time으로 해서 queue에 넣었다.
visit도 [s][clip]을 방문했는지 확인해 주면 된다.
조건 1.
s를 클립보드에 복사해서 넣는다.
그럼 clip은 s가 된다.
visit[s][s]가 0이라면 1로 바꾸어주고 queue에 넣어주면 된다.
조건 2.
clip를 화면에 같이 출력한다.
그럼 s는 s + clip이 된다.
다음 과정은 조건 1과 동일하게 하면 된다.
조건 3.
화면에 s를 1 줄인다.
s는 s - 1로 하고 동일한 과정을 수행해 준다.
popleft를 할 때 s가 n이라면 time을 return 해주면 된다.
from collections import deque
def bfs():
queue = deque()
queue.append((1, 0, 0))
visit[1][0] = 1
while queue:
s, clip, time = queue.popleft()
if s == n:
return time
if visit[s][s] == 0:
visit[s][s] = 1
queue.append((s, s, time + 1))
if s + clip <= n and visit[s + clip][clip] == 0:
visit[s + clip][clip] = 1
queue.append((s + clip, clip, time + 1))
if s - 1 >= 0 and visit[s - 1][clip] == 0:
visit[s - 1][clip] = 1
queue.append((s - 1, clip, time + 1))
n = int(input())
visit = [[0 for _ in range(n + 1)] for _ in range(n + 1)]
print(bfs())
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold3 - 2638번 치즈 (Python) (1) | 2023.05.04 |
---|---|
[백준/BOJ] gold4 - 13913번 숨바꼭질4 (Python) (2) | 2023.04.27 |
[백준/BOJ] gold5 - 16928번 뱀과 사다리 게임 (Python) (0) | 2023.04.24 |
[백준/BOJ] gold4 - 9019번 DSLR (Python) (1) | 2023.04.13 |
[백준/BOJ] gold4 - 1261번 알고스팟 (Python) (2) | 2023.04.12 |