관리 메뉴

Partially Committed

[λ°±μ€€ 9019] DSLR μžλ°”(BFS + 경둜 좔적) λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[λ°±μ€€ 9019] DSLR μžλ°”(BFS + 경둜 좔적)

WonderJay 2023. 6. 3. 12:39
728x90
λ°˜μ‘ν˜•
SMALL

졜근 ν’€μ—ˆλ˜ 문제 쀑에 κ°€μž₯ μž¬λ°Œμ—ˆλ˜ 것 κ°™μ•„μ„œ μ˜€λžœλ§Œμ— λ°±μ€€ ν¬μŠ€νŒ… 😊

 

9019번: DSLR (acmicpc.net)

 

9019번: DSLR

λ„€ 개의 λͺ…λ Ήμ–΄ D, S, L, R 을 μ΄μš©ν•˜λŠ” κ°„λ‹¨ν•œ 계산기가 μžˆλ‹€. 이 κ³„μ‚°κΈ°μ—λŠ” λ ˆμ§€μŠ€ν„°κ°€ ν•˜λ‚˜ μžˆλŠ”λ°, 이 λ ˆμ§€μŠ€ν„°μ—λŠ” 0 이상 10,000 미만의 μ‹­μ§„μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλ‹€. 각 λͺ…λ Ήμ–΄λŠ” 이 λ ˆμ§€μŠ€ν„°μ—

www.acmicpc.net

문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ μš”μ•½ν•˜μžλ©΄

 

μ΄ˆκΈ°κ°’ A

λͺ©ν‘œκ°’ B  κ°€ 주어지면

 

μ•„λž˜ 4가지 연산을 ν†΅ν•΄μ„œ B둜 도달할 수 μžˆλŠ” 경둜λ₯Ό 좜λ ₯ν•˜λŠ” 것이닀.

 

D μ—°μ‚°: D λŠ” n을 두 배둜 λ°”κΎΌλ‹€. κ²°κ³Ό 값이 9999 보닀 큰 κ²½μš°μ—λŠ” 10000 으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό μ·¨ν•œλ‹€. κ·Έ κ²°κ³Ό κ°’(2n mod 10000)을 λ ˆμ§€μŠ€ν„°μ— μ €μž₯ν•œλ‹€.

S μ—°μ‚°:  S λŠ” nμ—μ„œ 1 을 λΊ€ κ²°κ³Ό n-1을 λ ˆμ§€μŠ€ν„°μ— μ €μž₯ν•œλ‹€. n이 0 이라면 9999 κ°€ λŒ€μ‹  λ ˆμ§€μŠ€ν„°μ— μ €μž₯λœλ‹€.

L μ—°μ‚°: L 은 n의 각 자릿수λ₯Ό μ™ΌνŽΈμœΌλ‘œ νšŒμ „μ‹œμΌœ κ·Έ κ²°κ³Όλ₯Ό λ ˆμ§€μŠ€ν„°μ— μ €μž₯ν•œλ‹€. 이 연산이 λλ‚˜λ©΄ λ ˆμ§€μŠ€ν„°μ— μ €μž₯된 λ„€ μžλ¦Ώμˆ˜λŠ” μ™ΌνŽΈλΆ€ν„° d2, d3, d4, d1이 λœλ‹€.

R μ—°μ‚°: R 은 n의 각 자릿수λ₯Ό 였λ₯ΈνŽΈμœΌλ‘œ νšŒμ „μ‹œμΌœ κ·Έ κ²°κ³Όλ₯Ό λ ˆμ§€μŠ€ν„°μ— μ €μž₯ν•œλ‹€. 이 연산이 λλ‚˜λ©΄ λ ˆμ§€μŠ€ν„°μ— μ €μž₯된 λ„€ μžλ¦Ώμˆ˜λŠ” μ™ΌνŽΈλΆ€ν„° d4, d1, d2, d3이 λœλ‹€.

 

예λ₯Ό λ“€μ–΄,

 

A: 1234 이고 B: 3412 이면

LL ν˜Ήμ€ RR 을 ν†΅ν•΄μ„œ λͺ©ν‘œκ°’μœΌλ‘œ 도달할 수 있고, 정닡은 LL λ˜λŠ” RR 이닀. μ΄λŠ” μ–΄λ–€ 연산을 λ¨Όμ € μˆ˜ν–‰(탐색)ν•΄λ³Ό 것이냐에 λ”°λΌμ„œ 달라지며, λ‚˜μ˜¬ 수 μžˆλŠ” μ •λ‹΅μ˜ 경우의 μˆ˜λŠ” μ—¬λŸ¬ κ°œκ°€ 될 수 μžˆλ‹€. (λͺ¨λ‘ μ •λ‹΅μž„)

 

μ–΄λ–»κ²Œ ν’€ 수 μžˆμ„κΉŒ?

 

μ§€λ‚œ μ£Ό, μš΄μ˜ν•˜κ³  μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜ μŠ€ν„°λ””μ—μ„œ μ„ μ •ν–ˆλ˜ 문제인

 

μˆ¨λ°”κΌ­μ§ˆ 4 λ₯Ό ν’€μ—ˆλ‹€λ©΄, 풀이 λ°©ν–₯은 μ‰½κ²Œ μœ μΆ”ν•  수 μžˆμ„ 것이닀.

 

μ΄ˆκΈ°κ°’ A λ…Έλ“œμ—μ„œ

 

D, S, L, R 에 λ”°λ₯Έ 4 개의 μžμ‹ λ…Έλ“œκ°€ 생기고

 

또 κ·Έ μžμ‹λ…Έλ“œμ—μ„œλ„ 4 개의 μžμ‹λ…Έλ“œκ°€ 생기고 ...

 

μ΄λŸ¬ν•œ λΆ„κΈ°(Branch)λ₯Ό μˆ˜ν–‰ν•˜λ©° B 값에 λ„λ‹¬ν–ˆλŠ”μ§€ ν™•μΈν•œλ‹€.

 

B 값에 λ„λ‹¬ν–ˆλ‹€λ©΄,더 μ΄μƒμ˜ λΆ„κΈ°λ₯Ό ν•˜μ§€ μ•Šκ³  μ§€κΈˆκΉŒμ§€ λ‚΄λ €μ˜¨ 경둜λ₯Ό 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

자, κ·Έλž˜ν”„ 탐색 문제둜 μΉ˜ν™˜λ˜μ—ˆλ‹€.

 

이제 κ³ λ―Όν•  것은 DFS / BFS  쀑 μ–΄λŠ 것이 더 νš¨μœ¨μ μΈμ§€λ₯Ό 따져보아야 ν•œλ‹€.

 

DFS 둜 νƒμƒ‰ν•˜λŠ” κ²½μš°μ—λŠ” νš¨μœ¨μ μ΄μ§€ μ•Šμ„ κ²ƒμž„μ„ μ§κ΄€μ μœΌλ‘œ μ•Œ 수 μžˆμ„ 것이닀.

 

깊게 λκΉŒμ§€ (μ–Έμ œ 끝날지도 λͺ¨λ₯Ό) νŒŒκ³ λ“€κΈ° λ³΄λ‹€λŠ” λ„“κ²Œ λ„“κ²Œ νƒμƒ‰ν•˜λ©΄μ„œ λͺ©ν‘œ μƒνƒœλ‘œ λ„λ‹¬ν•˜λŠ” 지 νŒλ‹¨ν•˜λŠ” 것이 μ’‹λ‹€.

 

μ™œλƒλ©΄?

 

μš°λ¦¬λŠ” μ΅œλ‹¨ 경둜λ₯Ό 좜λ ₯ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

BFS λŠ” λ„“κ²Œ λ„“κ²Œ νƒμƒ‰ν•˜λ―€λ‘œ, 졜초둜 λͺ©ν‘œ μƒνƒœμ— λ„λ‹¬ν–ˆλ‹€λ©΄ κ·Έ λ–„κ°€ λ°”λ‘œ μ΅œλ‹¨ 경둜인 것이닀.

 

DFS μ—μ„œλŠ” 이λ₯Ό λ³„λ„λ‘œ 관리해주어야 ν•˜λ―€λ‘œ ꡉμž₯히 λΉ„νš¨μœ¨μ μΌ κ²ƒμž„μ„ μ•Œ 수 μžˆλ‹€.

 

자, 그럼 BFS 둜 ν’€μ΄ν•˜λ©΄ λœλ‹€.

 

이제 또 고민이닀.

 

초기 μƒνƒœ(A) 에 λŒ€ν•˜μ—¬

 

D,S,L,R 연산을 μˆ˜ν–‰ν•œ μžμ‹ λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λ©΄μ„œ λͺ©ν‘œ μƒνƒœ(B) 둜 λ„λ‹¬ν•˜λŠ” 탐색은 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμ„ 것 같은데,

 

초기 μƒνƒœ(A) -> λͺ©ν‘œ μƒνƒœ(B) κΉŒμ§€μ˜ κ²½λ‘œλŠ” μ–΄λ–»κ²Œ μ €μž₯/좜λ ₯ν•  수 μžˆμ„κΉŒ?

 

λ°”λ‘œ λ…Έλ“œμ— μ§€κΈˆκΉŒμ§€ 거쳐온 λͺ…령어듀을 κΈ°λ‘ν•˜λŠ” 것이닀.

 

즉,

 

초기 μƒνƒœμ˜ λ…Έλ“œλŠ” (A, "") 이라면

 

D λ₯Ό μˆ˜ν–‰ν•œ μžμ‹ λ…Έλ“œλŠ” (doD(A), "D")

S λ₯Ό μˆ˜ν–‰ν•œ μžμ‹ λ…Έλ“œλŠ” (doS(A), "S")

L λ₯Ό μˆ˜ν–‰ν•œ μžμ‹ λ…Έλ“œλŠ” (doL(A), "L")

R λ₯Ό μˆ˜ν–‰ν•œ μžμ‹ λ…Έλ“œλŠ” (doR(A), "R")

 

μ΄λŸ°μ‹μœΌλ‘œ λ…Έλ“œμ— 거쳐온 λͺ…λ Ήμ–΄λ₯Ό κΈ°λ‘ν•˜μž.

 

이λ₯Ό μœ„ν•΄μ„œ Node ν΄λž˜μŠ€μ— String ν•„λ“œλ₯Ό λ§Œλ“€μ–΄μ£Όκ³ , 큐에 Insert ν•  λ•Œλ§ˆλ‹€ append 연산을 μˆ˜ν–‰ν•˜λ©΄ 될 것이닀.

 

 

 

μžλ°”λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄,

String 에 κ³„μ†ν•΄μ„œ append 연산을 ν•œλ‹€λŠ” 것은 κ°€λ Ή μ•„λž˜μ™€ 같이

str + "R" 이런 μ‹μœΌλ‘œ ν•  텐데

String 은 λΆˆλ³€ κ°μ²΄μ΄λ―€λ‘œ, λ‚΄λΆ€ ꡬ쑰에 λ”°λ₯΄λ©΄ μƒˆλ‘œμš΄ String 객체λ₯Ό λ§Œλ“€κ³  λ³΅μ‚¬ν•˜κ³  append ν•˜λŠ” 과정을 κ±°μΉœλ‹€.

즉, String 을 μ΄μš©ν•˜λŠ” 것은 λ‹€μ†Œ λΉ„νš¨μœ¨μ μΈ 츑면이 μ‘΄μž¬ν•˜λ©°

StringBuilder 을 μ‚¬μš©ν•˜λŠ” 것이 쑰금 더 μ΅œμ ν™”ν•  수 μžˆλŠ” 방법일 것이닀.

ν•˜μ§€λ§Œ 이 λ¬Έμ œλŠ” String 을 μ‚¬μš©ν•΄λ„ μ‹œκ°„ μ΄ˆκ³Όμ— κ±Έλ¦¬μ§€λŠ” μ•ŠλŠ”λ‹€. πŸ‘

 λ§Œμ•½ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•œλ‹€λ©΄, String 에 λŒ€ν•œ update λ₯Ό StringBuilder 으둜 λ°”κΏ” λ³΄λŠ” 것이 쒋을 것 κ°™λ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  μ—¬μ „νžˆ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•œλ‹€λ©΄ μ•„λž˜μ˜ 체크리슀트λ₯Ό ν™•μΈν•΄λ³΄μž.

 

1. 갈 ν•„μš” μ—†λŠ” λ…Έλ“œλ₯Ό 또 λ°©λ¬Έν•˜λ €κ³  ν•˜μ§€λŠ” μ•Šμ€μ§€? (사이클 λ°œμƒ 주의) βœ”οΈ

2. D,  S, L, R 연산을 λΉ„νš¨μœ¨μ μœΌλ‘œ κ΅¬ν˜„ν•œ 것은 μ•„λ‹Œμ§€? D,S,L,R 연산은 λͺ¨λ‘ ν•œ μ€„λ‘œ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€. L,R μ—μ„œ for 문을 μ‚¬μš©ν•œλ‹€λ˜κ°€ ν•˜λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•  μˆ˜λ„ μžˆκ² λ‹€. βœ”οΈ

3. μž…μΆœλ ₯을 BufferedReader, BufferedWriter 을 μ‚¬μš©ν–ˆλŠ”μ§€? (Scanner λŠ” 많이 λŠλ¦¬λ‹€.) βœ”οΈ

 

 

μ•„λž˜λŠ” κ΅¬ν˜„ μ½”λ“œμ΄λ‹€.

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        ///System.setIn(new FileInputStream("src/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer stk;

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

        while (tc-- > 0) {
            stk = new StringTokenizer(br.readLine());
            boolean[] visited = new boolean[20000];

            int A = Integer.parseInt(stk.nextToken()); // λ ˆμ§€μŠ€ν„°μ˜ μ΄ˆκΉƒκ°’
            int B = Integer.parseInt(stk.nextToken()); // λ ˆμ§€μŠ€ν„°μ˜ μ΅œμ’…κ°’

            Queue<Node> q = new LinkedList<>();
            q.add(new Node(A, ""));
            boolean flag = false;
            while (!q.isEmpty()) {
                if (flag) break;
                Node now = q.poll();
                int t = now.num;
                String str = now.instruction;
                for (Node nn : new Node[]{new Node(doD(t), str + "D"), new Node(doS(t), str + "S"),
                        new Node(doL(t), str + "L"), new Node(doR(t), str + "R")}) {
                    if (visited[nn.num]) continue;
                    if (nn.num == B) {
                        bw.write(nn.instruction + "\n");
                        flag = true;
                        break;
                    }
                    q.add(nn);
                    visited[nn.num] = true;
                }
            }
        }

        bw.flush();
        bw.close();
    }

    public static class Node {
        int num;
        String instruction;

        public Node(int num, String instruction) {
            this.num = num;
            this.instruction = instruction;
        }
    }

    public static int doD(int n) {
        return (2 * n) % 10000;
    }

    public static int doS(int n) {
        return n == 0 ? 9999 : n - 1;
    }

    public static int doL(int n) { // 1234 -> 2341
        return (n % 1000) * 10 + (n / 1000);
    }

    public static int doR(int n) { // 1234 -> 4123
        return n / 10 + (n % 10) * 1000;
    }
}

2023. 06. 03.

 

728x90
λ°˜μ‘ν˜•
LIST
Comments