[ BOJ / Python ] 14226번 이모티콘

황승환·2022년 8월 4일
0

Python

목록 보기
418/498


이번 문제는 BFS를 통해 해결하였다. 클립으로 복사하는 연산, 클립을 화면에 추가하는 연산, 화면의 이모티콘 하나를 지우는 연산을 가독성을 위해 함수로 정의하였고, 방문처리는 2차원 리스트를 사용하여 [화면의 이모티콘수][클립의 이모티콘수]로 활용하였다. 범위를 벗어나지 않도록 다음 화면과 클립의 이모티콘 수를 0에서 1000까지로 제한하도록 하였고, 이와 같은 방법으로 BFS를 구현하여 해결하였다.

Code

from collections import deque
s = int(input())
def copy_to_clip(cur, clip):
    clip = cur
    return cur, clip
def add_to_cur(cur, clip):
    cur += clip
    return cur, clip
def delete_cur(cur, clip):
    cur -= 1
    return cur, clip
def bfs():
    q = deque()
    q.append((1, 0, 0))
    visited = [[False for _ in range(1001)] for _ in range(1001)]
    visited[1][0] = True
    while q:
        cur, clip, time = q.popleft()
        if cur > 1000 or cur < 0:
            continue
        if cur == s:
            return time
        nxt_cur, nxt_clip = copy_to_clip(cur, clip)
        if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
            visited[nxt_cur][nxt_clip] = True
            q.append((nxt_cur, nxt_clip, time+1))
        nxt_cur, nxt_clip = add_to_cur(cur, clip)
        if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
            visited[nxt_cur][nxt_clip] = True
            q.append((nxt_cur, nxt_clip, time+1))
        nxt_cur, nxt_clip = delete_cur(cur, clip)
        if 0 <= nxt_cur <= 1000 and 0 <= nxt_clip <= 1000 and not visited[nxt_cur][nxt_clip]:
            visited[nxt_cur][nxt_clip] = True
            q.append((nxt_cur, nxt_clip, time+1))
print(bfs())

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글