문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
풀이
목적지까지 최단거리(시간)를 구하는 문제이기 때문에 BFS 이용해서 문제 풀이함
visited[s][c]는 현재 이모티콘 s개, 클립보드에 이모티콘 c개가 있는 상황까지 도달하기 위한 최소 시간
문제의 3가지 연산을 BFS 안에서 조건문을 통해 각각 실행해 visited에 기록함
소스코드
from collections import deque
n = int(input())
q = deque()
q.append((1, 0)) # [현재 이모티콘 개수, 클립보드 이모티콘 개수]
visited = dict()
visited[(1, 0)] = 0
while q:
s, c = q.popleft()
if s == n:
print(visited[(s, c)])
break
# 1번 연산 : 화면에 있는 모든 이모티콘을 복사
if (s, s) not in visited.keys():
visited[(s, s)] = visited[(s, c)] + 1
q.append((s, s))
# 2번 : 화면에 있는 모든 이모티콘 중 1개 삭제
if (s-1, c) not in visited.keys():
visited[(s-1, c)] = visited[(s, c)] + 1
q.append((s-1, c))
# 3번 연산 : 클립보드에 있는 이모티콘을 붙여넣기
if (s+c, c) not in visited.keys():
visited[(s+c, c)] = visited[(s, c)] + 1
q.append((s+c, c))
github.com/jisun1125/algorithm-problem-solving/blob/main/baekjoon/no_14226.py
'PS > 백준' 카테고리의 다른 글
[백준/Python(파이썬)] 13549 숨바꼭질 3 (0) | 2021.03.02 |
---|---|
[백준/Python(파이썬)] 1208 부분수열의 합2 덜 풀었음 (0) | 2021.03.02 |
[백준/Python(파이썬)] 2138 전구와 스위치 (0) | 2021.02.17 |
[백준/Python(파이썬)] 1931 회의실 배정 (0) | 2021.02.16 |
[백준/Python(파이썬)] 13398 연속합2 (0) | 2021.02.16 |