베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 9019번: DSLR

2023. 1. 16. 19:45

키워드

  1. D: D 는 n을 두 배로 바꾼다. 결과 값이 9999 보다 큰 경우에는 10000 으로 나눈 나머지를 취한다. 그 결과 값(2n mod 10000)을 레지스터에 저장한다.
  1. S: S 는 n에서 1 을 뺀 결과 n-1을 레지스터에 저장한다. n이 0 이라면 9999 가 대신 레지스터에 저장된다.
  1. L: L 은 n의 각 자릿수를 왼편으로 회전시켜 그 결과를 레지스터에 저장한다. 이 연산이 끝나면 레지스터에 저장된 네 자릿수는 왼편부터 d2, d3, d4, d1이 된다.
  1. R: R 은 n의 각 자릿수를 오른편으로 회전시켜 그 결과를 레지스터에 저장한다. 이 연산이 끝나면 레지스터에 저장된 네 자릿수는 왼편부터 d4, d1, d2, d3이 된다.

구현

  • 각 4가지 동작 방식을 구현한다.
  • 이후 너비우선 탐색을 이용하여 한 번 반복 시 4개의 형태를 큐에 삽입한다.
  • 만약 이미 만들어진 값이 존재한다면, 추가하지 않는다.
  • 가장 먼저 B가 만들어지면 메소드를 반환한다.

코드

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

public class java_9019 {
    // 테스트 케이스의 수
    static int T;

    // A : 초깃값
    // B : 목표값
    static int A, B;

    // 2배
    // 단, n*2 > 9999면 n*2%10000 반환
    static int commandD(int number) {
        int result = number;

        result *= 2;

        if (result > 9999) {
            result %= 10000;
        }

        return result;
    }

    // n-1연산. 단, n-1==0이면 9999반환
    static int commandS(int number) {
        int result = number;

        result -= 1;

        if (result < 0) {
            result = 9999;
        }

        return result;
    }

    // 왼쪽으로 돌리기
    static int commandL(int number) {
        int result = number;

        // 맨 앞자리 추출
        int first = number / 1000;

        // 원래 숫자 %1000 *10
        result = result % 1000 * 10;

        // 맨 앞자리 뒤에 더하기
        result += first;

        return result;
    }

    // 오른쪽으로 돌리기
    static int commandR(int number) {
        int result = number;

        // 맨 뒷자리 추출
        int last = number % 10;

        // 원래 숫자 /10
        result = result / 10;

        // 맨 앞자리 뒤에 더하기
        result += last * 1000;

        return result;
    }

    // 지금까지의 명령어, 레지스터값을 저장하는 클래스
    static class Pair {
        StringBuffer command;
        int number;

        public Pair(StringBuffer command, int number) {
            this.command = command;
            this.number = number;
        }
    }

    // 가장 먼저 B가 만들어지는 명령어를 반환하는 메소드
    static StringBuffer solution() {
        // 중복 방문 처리
        boolean isVisited[] = new boolean[10000];

        StringBuffer result = new StringBuffer();

        // 너비 우선 탐색 시작
        Queue<Pair> queue = new ArrayDeque<>();

        queue.add(new Pair(new StringBuffer(), A));

        while (true) {
            Pair here = queue.poll();

            // 목표값이 만들어지면 종료
            if (here.number == B) {
                result = here.command;
                break;
            }

            // D,S,L,R 한 번 씩 다 해보기
            // D
            int nextNumber = commandD(here.number);
            if (!isVisited[nextNumber]) {
                isVisited[nextNumber] = true;
                queue.add(new Pair(new StringBuffer(here.command).append('D'), nextNumber));
            }

            // S
            nextNumber = commandS(here.number);
            if (!isVisited[nextNumber]) {
                isVisited[nextNumber] = true;
                queue.add(new Pair(new StringBuffer(here.command).append('S'), nextNumber));
            }

            // L
            nextNumber = commandL(here.number);
            if (!isVisited[nextNumber]) {
                isVisited[nextNumber] = true;
                queue.add(new Pair(new StringBuffer(here.command).append('L'), nextNumber));
            }

            // R
            nextNumber = commandR(here.number);
            if (!isVisited[nextNumber]) {
                isVisited[nextNumber] = true;
                queue.add(new Pair(new StringBuffer(here.command).append('R'), nextNumber));
            }
        }

        return result;
    }

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

        T = Integer.parseInt(br.readLine());

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

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

            StringBuffer result = solution();
            System.out.println(result.toString());
        }

        br.close();
    }
}


Uploaded by N2T

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 2343번: 기타 레슨  (0) 2023.01.30
[BOJ/JAVA] 23631번: 진심 좌우 반복뛰기  (0) 2023.01.30
[BOJ/JAVA] 17129번: 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유  (0) 2023.01.16
[BOJ/JAVA] 13023번: ABCDE  (0) 2023.01.16
[BOJ/JAVA] 4803번: 트리  (0) 2023.01.12
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 2343번: 기타 레슨
    • [BOJ/JAVA] 23631번: 진심 좌우 반복뛰기
    • [BOJ/JAVA] 17129번: 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유
    • [BOJ/JAVA] 13023번: ABCDE
    베오
    베오

    티스토리툴바