백준 9019 DSLR (Java,자바)

jonghyukLee·2022년 3월 11일
0

이번에 풀어본 문제는
백준 9019번 DSLR 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Dslr
{
    int n;
    String cmd;

    public Dslr(int n, String cmd)
    {
        this.n = n;
        this.cmd = cmd;
    }

}
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        while(t-- > 0)
        {
            st = new StringTokenizer(br.readLine());

            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());

            Queue<Dslr> q = new LinkedList<>();
            q.add(new Dslr(A,""));
            boolean [] visited = new boolean[10000];
            visited[A] = true;
            while(!q.isEmpty())
            {
                Dslr cur = q.poll();
                if(cur.n == B)
                {
                    sb.append(cur.cmd).append("\n");
                    break;
                }

                for(int i = 0; i < 4; ++i)
                {
                    Dslr next = calc(cur.n,i);
                    if(visited[next.n]) continue;
                    visited[next.n] = true;
                    q.add(new Dslr(next.n,cur.cmd+next.cmd));
                }
            }
        }
        System.out.print(sb);
    }
    static Dslr calc(int n, int cmd)
    {
        int res = n;
        //D
        if(cmd == 0)
        {
            res = (res * 2) % 10000;
            return new Dslr(res,"D");
        }
        //S
        else if(cmd == 1)
        {
            res = res == 0 ? 9999 : res-1;
            return new Dslr(res,"S");
        }
        //L
        else if(cmd == 2)
        {
            int tmp = (res % 1000) * 10;
            tmp += (res / 1000);

            return new Dslr(tmp,"L");
        }
        //R
        else
        {
            int tmp = (res % 10) * 1000;
            tmp += (res / 10);

            return new Dslr(tmp,"R");
        }
    }
}

📝 풀이

숫자 A를 숫자 B로 만들기 위한 최소횟수의 연산을 순차적으로 출력하는 문제입니다. 연산은 D,S,L,R 4가지가 있으며 연산에 대한 정보는 문제에서 확인하실 수 있습니다.
이 문제도 간단한 bfs로 해결할 수 있습니다. 먼저 시작값인 A를 큐에 담아주고, 큐에서 값을 꺼낼 때 마다 4가지 연산을 수행한 값을 큐에 다시 담아주면 됩니다. 같은 연산이 반복되지 않도록 방문배열을 활용해주면서, 큐에서 꺼낸 값이 B라면 즉시 반복을 벗어나, 진행했던 연산을 담아둔 문자열을 Stringbuilder에 추가해주면 됩니다.

📜 후기

L,R연산만 해결한다면 어렵지 않게 풀 수 있는 문제라고 생각합니다.

profile
머무르지 않기!

0개의 댓글