Algorithm & Problem Solving/그래프 이론(DFS & BFS)
[백준 14226] 이모티콘 (Python)
baby_ohgu
2020. 12. 15. 12:15
14226번: 이모티콘
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만
www.acmicpc.net
문제풀이
S : 입력값
dp : 화면과 클립보드를 표현할 2차원 리스트, dp[i][j] = x : 화면에 있는 이모티콘의 갯수 i개, 클립보드에 있는 이모티콘의 갯수j개 일때 걸린 시간 x초
q : i, j 를 BFS로 탐색하는 deque
ans : 결과값
1. BFS를 이용해 세 가지 경우를 탐색하여 deque에 넣어준다. (이때 각 연산은 1초가 소요)
- 화면에 있는 i개의 이모티콘을 클립보드에 붙이는 경우 => dp[i][i] = dp[i][j] + 1
문제에서 클립보드에 이모티콘을 붙일 경우 덮어씌워진다고 하였기 때문에 클립보드도 i개의 이모티콘이 된다.
- 클립보드에 있는 j개의 이모티콘을 화면에 붙이는 경우 => dp[i+j][j] = dp[i][j] + 1
- 화면에서 이모티콘을 1개 삭제하는 경우 => dp[i - 1]j] = dp[i][j] + 1
2. 화면에 있는 이모티콘의 갯수가 S개 일때까지 deque에 (i, j)를 넣어주면서 1의 과정 반복
3. 화면에 있는 이모티콘의 갯수가 S개 일때 dp[S] 에서 최소값을 결과로 출력(-1은 초기값이므로 제외)
코드
import sys
from collections import deque
if __name__ == '__main__':
S = int(input())
# dp[i][j] = x : 화면에 있는 이모티콘의 갯수 i개, 클립보드에 있는 이모티콘의 갯수 j개 일때 걸린 시간 x초
dp = [[-1] * 1001 for _ in range(1001)]
dp[1][0] = 0
q = deque([(1, 0)])
# 각 연산은 1초가 소요
while q:
i, j = q.popleft()
# 화면에 있는 i개의 이모티콘을 클립보드에 붙이는 경우
if i <= 1000:
if dp[i][i] == -1:
dp[i][i] = dp[i][j] + 1
q.append((i, i))
# 클립보드에 있는 j개의 이모티콘을 화면에 붙이는 경우
if i + j <= 1000:
if dp[i + j][j] == -1:
dp[i + j][j] = dp[i][j] + 1
q.append((i + j, j))
# 화면에서 이모티콘을 1개 삭제하는 경우
if i - 1 >= 0:
if dp[i - 1][j] == -1:
dp[i - 1][j] = dp[i][j] + 1
q.append((i - 1, j))
if i == S: break
ans = sys.maxsize
for y in dp[S]:
if y != -1: ans = min(ans, y)
print(ans)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!