Algorithm/Baekjoon

[백준]14226번 이모티콘 파이썬 python

rrojin 2022. 1. 14. 10:53

문제링크

https://www.acmicpc.net/problem/14226

 

14226번: 이모티콘

영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만

www.acmicpc.net

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import sys
from collections import deque
 
input = sys.stdin.readline
MAX = 2000
 
target = int(input())
 
def bfs(target):
    dq = deque()
    visited = [[-1]*MAX for _ in range(MAX)] #화면,클립보드 방문횟수
    s = 1 #화면
    c = 0 #클립보드
    dq.append((s,c))
    visited[s][c]=0
    while dq:
        s,c = dq.popleft()
        #target과 일치
        if s==target:
            print(visited[s][c])
            break
 
        # action1 화면-> 클립보드
        nc = s
        if 0<=s<MAX and 0<=nc<MAX and visited[s][nc]==-1:
            visited[s][nc]=visited[s][c]+1
            dq. append((s,nc))
 
        # action2 클립보드 -> 화면
        ns = s + c
        if c!=0 and 0<=ns<MAX and 0<=c<MAX and visited[ns][c]==-1:
            visited[ns][c]= visited[s][c]+1
            dq.append((ns, c))
        #action3 화면 -1
        ns = s - 1
        if s>0 and 0<=ns<MAX and 0<=c<MAX and visited[ns][c]==-1:
            visited[ns][c] = visited[s][c]+1
            dq.append((ns, c))
 
bfs(target)
cs

핵심Point

* BFS로 풀 수 있는 이유 : 가중치가 같은 최단경로 문제 유형
노드 : 화면에 있는 현재 이모티콘 수
간선 : 문제에서 정의한 3가지 action
이때, 마지막 action인 화면에서 -1은 화면 값이 목표값보다 커졌을때만 필요한가? 라는 생각이 들었지만 아닌 경우도 있다.

* 화면과 클립보드를 어떻게 표현할 것인가
해결)이모티콘 갯수 정보만 필요한 것 이므로 변수로 표현한다.
      이때, 화면 업데이트시 그 당시의 클립보드 수가 필요하므로 (#화면, #클립보드)의 쌍으로 정보를 저장한다.