본문 바로가기

TIL

백준 14226 이모티콘(python)

문제

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

 

14226번: 이모티콘

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

www.acmicpc.net


주어진 경우에 맞게 연산들을 진행해 나가며 목표 개수에 도달하는 문제입니다. BFS 방식으로 접근하였습니다. 과정은 다음과 같습니다.

  • 각 경우로 조건을 나누어서 연산을 진행해 줍니다.
  • 연산된 결과를  통해 이전에 접근했는지를 확인해줍니다. 가보지 않은 경우라면 큐에 넣어주고 과정을 진행합니다.
  • 최종적으로 목표 개수에 도달하면 시간값을 출력해 줍니다.

확인 리스트를 2차원으로 한 이유는 화면에 있는 숫자 상황만 체크하면 넘어가는 경우가 있기 때문입니다.


소스코드 

import sys
from collections import deque

input = sys.stdin.readline

q = deque()
MAX = 1001
S = int(input())
q.append((1, 0, 0))  # 화면개수, 클립보드, 시간
ch = [[0]*MAX for _ in range(MAX)]
while q:
    tmp = q.popleft()

    if tmp[0] == S:  # 목적 개수 달성하면 출력
        print(tmp[2])
        break

    if ch[tmp[0]][tmp[0]] == 0:  # 클립보드에 개수 복사
        ch[tmp[0]][tmp[0]] = 1
        q.append((tmp[0], tmp[0], tmp[2]+1))

    if tmp[1]+tmp[0] < MAX and ch[tmp[0]+tmp[1]][tmp[1]] == 0:  # 화면에 클립보드에 있는 개수 붙여넣기
        ch[tmp[0]+tmp[1]][tmp[1]] = 1
        q.append((tmp[0]+tmp[1], tmp[1], tmp[2]+1))

    if tmp[0]-1 > 0:  # 화면 이모티콘 개수 하나 빼기
        if tmp[0] < MAX and ch[tmp[0]-1][tmp[1]] == 0:
            ch[tmp[0]-1][tmp[1]] = 1
            q.append((tmp[0]-1, tmp[1], tmp[2]+1))

'TIL' 카테고리의 다른 글

백준 20119 클레어와 물약(python)  (0) 2021.08.26
백준 2638 치즈(python)  (0) 2021.08.25
백준 13549 숨바꼭질 3(python)  (2) 2021.08.23
백준 2637 장난감 조립(python)  (0) 2021.08.22
백준 2617 구슬 찾기(python)  (0) 2021.08.21