티스토리 뷰

PS/백준

[백준] 9019 DSLR

HUN 2021. 2. 26. 18:17


주어진 수를 목표 숫자로 만들기 위한 최소한의 연산을 구하는 문제이다.

 

간단하게 BFS를 동해서 해결이 가능하다. 하지만 알고리즘 구현 중 여러 실수를 하였다.

 

1. 단순히 최소한이라는 말에 혹하여 우선순위 큐를 사용하였다.

BFS를 통해 트리를 그려보면 일반적인 큐와 우선순위 큐가 동일하게 작동한다.

 

2. 중복되는 수를 고려하지 않았다.

연산을 통해 만들어지는 수가 중복 될 수 있음이 명확하지만 이를 고려하지 않았다. 방문 배열을 통해 이전에 만들어진 수 인지 확인해야한다.

from sys import stdin
from collections import deque

readline = stdin.readline


def get_min_command():
    init, target = map(int, readline().split())
    q = deque()
    visited = [False] * 10000
    q.append(['', init])
    visited[init] = True
    while q:
        c, n = q.popleft()
        visited[n] = True
        if n == target:
            return c

        dn = (n * 2) % 10000
        sn = n - 1 if n != 0 else 9999
        ln = int(n % 1000 * 10 + n / 1000)
        rn = int(n % 10 * 1000 + n // 10)
        if dn == target:
            return c + "D"
        if sn == target:
            return c + "S"
        if ln == target:
            return c + "L"
        if rn == target:
            return c + "R"

        if not visited[dn]:
            visited[dn] = True
            q.append([c + "D", dn])

        if not visited[sn]:
            visited[sn] = True
            q.append([c + "S", sn])

        if not visited[ln]:
            visited[ln] = True
            q.append([c + "L", ln])

        if not visited[rn]:
            visited[rn] = True
            q.append([c + "R", rn])


if __name__ == "__main__":
    T = int(readline().strip())
    for _ in range(T):
        print(get_min_command()) 

 

 

728x90

'PS > 백준' 카테고리의 다른 글

[백준] 11657 타임머신  (0) 2021.02.28
[백준] 5719 거의 최단 경로  (0) 2021.02.26
[백준] 1707 이분 그래프  (0) 2021.02.25
[백준] 1992 쿼드트리  (0) 2021.02.23
[백준] 11866 요세푸스 문제0  (0) 2021.02.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함