반응형
12-24 00:25
Today
Total
«   2024/12   »
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
관리 메뉴

개발하는 고라니

[백준] 9019번 : DSLR 본문

Programming/백준

[백준] 9019번 : DSLR

조용한고라니 2021. 3. 13. 03:13
반응형
 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net


[BFS]

4가지의 함수를 구현하기만 하면 간단한 BFS이다. 이 문제의 핵심은 L()과 R()에서 얼마나 시간을 단축하느냐에 달린 것 같다. L, R 함수는 언뜻보면 간단하지만, 항상 4자리임을 가정하고 하는 것이라, 4자리 이하일 때 "0"을 채워 4자리를 만들어줘야한다. 이 과정이 노련한 사람에게는 짧고 간편한 코드로 작성할 수 있겠으나... 나같은 초심자에게는 잡기술을 동원해서 겨우 AC를 받아내었다.

 

    static int L(int x){

        StringBuilder str = new StringBuilder(Integer.toString(x));

        if(x < 1000) { //4자리 이하일 때
            StringBuilder tmp = new StringBuilder();
            for (int i = 0; i < 4 - str.length(); i++)
                tmp.append(0); //부족한 자리수만큼 0붙이기
            tmp.append(x); //기존 x 붙이기
            str = tmp; //str에 복사
        }

        char zero = str.toString().charAt(0); //첫째자리 수 떼어놓기
        StringBuilder sb = new StringBuilder();
        sb.append(str.toString(), 1, 4).append(zero); //2, 3, 4번째 자리수붙이고, zero 붙이기

        return Integer.parseInt(sb.toString());
    }
    static int R(int x){

        StringBuilder str = new StringBuilder(Integer.toString(x));

        if(x < 1000) {
            StringBuilder tmp = new StringBuilder();
            for (int i = 0; i < 4 - str.length(); i++)
                tmp.append(0);
            tmp.append(x);
            str = tmp;
        }

        char four = str.toString().charAt(3); //마지막 자리 수 떼어놓기
        StringBuilder sb = new StringBuilder();
        sb.append(four).append(str.toString(), 0, 3); //four 붙이고, 나머지 붙이기

        return Integer.parseInt(sb.toString());
    }

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static class Node{
        int v;
        String command;
        public Node(int vv, String c){
            v=vv; command=c;
        }
    }

    static int D(int x){
        return (2 * x) % 10000;
    }
    
    static int S(int x){
        return (x == 0)? 9999 : x - 1;
    }
    
    static int L(int x){

        StringBuilder str = new StringBuilder(Integer.toString(x));

        if(x < 1000) {
            StringBuilder tmp = new StringBuilder();
            for (int i = 0; i < 4 - str.length(); i++)
                tmp.append(0);
            tmp.append(x);
            str = tmp;
        }

        char zero = str.toString().charAt(0);
        StringBuilder sb = new StringBuilder();
        sb.append(str.toString(), 1, 4).append(zero);

        return Integer.parseInt(sb.toString());
    }
    
    static int R(int x){

        StringBuilder str = new StringBuilder(Integer.toString(x));

        if(x < 1000) {
            StringBuilder tmp = new StringBuilder();
            for (int i = 0; i < 4 - str.length(); i++)
                tmp.append(0);
            tmp.append(x);
            str = tmp;
        }

        char four = str.toString().charAt(3);
        StringBuilder sb = new StringBuilder();
        sb.append(four).append(str.toString(), 0, 3);

        return Integer.parseInt(sb.toString());
    }

    static boolean[] visit;

    static void BFS(int start, int end){

        Queue<Node> Q = new LinkedList<>();
        visit[start] = true;
        Q.add(new Node(start, ""));

        while(!Q.isEmpty()){
            Node n = Q.poll();
            int c = n.v;
            String command = n.command;

            if(c == end) {
                System.out.println(command);
                break;
            }

            int d = D(c);
            int s = S(c);
            int l = L(c);
            int r = R(c);

            if(d > -1 && d < 10000 && !visit[d]){
                visit[d] = true;
                Q.add(new Node(d, command + "D"));
            }
            if(s > -1 && s < 10000 && !visit[s]){
                visit[s] = true;
                Q.add(new Node(s, command + "S"));
            }
            if(l > -1 && l < 10000 && !visit[l]){
                visit[l] = true;
                Q.add(new Node(l, command + "L"));
            }
            if(r > -1 && r < 10000 && !visit[r]){
                visit[r] = true;
                Q.add(new Node(r, command + "R"));
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int k = Integer.parseInt(br.readLine());

        for(int i=0; i<k; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

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

            visit = new boolean[10001];

            BFS(A, B);
        }
    }
}
반응형

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

[백준] 2617번 : 구슬 찾기  (0) 2021.03.14
[백준] 1058번 : 친구  (0) 2021.03.14
[백준] 10816번 : 숫자 카드 2  (0) 2021.03.13
[백준] 1654번 : 랜선 자르기  (0) 2021.03.13
[백준] 10815번 : 숫자 카드  (0) 2021.03.12
Comments