본문 바로가기

Algorithm

백준 9019 DSLR Java

완전 탐색으로 가능한 문제인 DSLR 문제이다. 정답률은 난이도에 비해 많이 낮은 것 같은 21%이다.

쉽다는 말은 아니다.. 

이 문제는 

n과 m이 주어졌을 때

n에서 m으로 가는 최소한의 명령어를 출력하면 된다.

 

최소한의 명령어이고

가중치가 따로 없고 

크기도 그렇게 크지 않으므로

BFS탐색으로 정말 탐색하면 풀 수 있는 문제이다.

 

처음엔 시간 초과가 나왔었는데 L과 R 명령어를 처리할 때

문자열로 처리해서 시간 초과가 나왔던 것 같다.

뭔가 저런 자릿수를 바꾸는 구현은 문자열로 하는 습관이 있는데

고쳐야겠다.

 

이 문제를 내가 헤맨이유는

명령어를 똑바로 구현하지 못했기 때문이다.

꼭 명령어를 천천히 읽어보고 구현해야 할 것 같다.

내가 잘못 이해했던 부분은

 

S: S는 n에서 1을 뺀 결과 n-1을 레지스터에 저장한다. n이 0이라면 9999 가 대신 레지스터에 저장된다.

-> n에서 1을 뺐을 때 0이면 9999가 저장되는 줄 알았는데 아니었다.

처음부터 n의 값이 0이면 9999가 저장되면 되는 것이다.

 

L은 자릿수를 왼편으로 회전하고

R은 자릿수를 오른편으로 회전하는 명령어인데

 

나는 만약 n이 3자리 이면

3자리에서 오른쪽, 왼쪽으로 회전하는 줄 알았다.

n = 123이면 L = 231 , R = 312  이렇게 말이다.

하지만 문제는 무조건 네 자리 가정이었다..

n = 123이면 L = 1230 , R = 3210 이런 식으로 말이다.

 

문제에 3자리나 2자리 예제가 없어서 헷갈렸다..

문제를 이해하는 능력이 부족한 것 같다.. 더 많이 풀어보면 해결될 거라 믿고 있다..

 

명령어 나열을 하는 부분을 구현하는 방법은 다양한데

나는 그냥 String배열을 ""로 초기화하고

S면 +=S, L이면 +=L 이런 식으로

큐에 넣고 전의 것에 +=명령어를 해주었다.

나는 이 방식이 익숙하고 편하다..

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.Scanner;
 
public class Q9019 {
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int tc = scan.nextInt();
        
        while(tc-- > 0) {
            int n = scan.nextInt();
            int m = scan.nextInt();
            String [] command = new String[10000];
            boolean [] visited = new boolean[10000];
            Queue<Integer> q = new LinkedList<>();
            
            visited[n] = true;
            q.add(n);
            Arrays.fill(command, "");
            
            while(!q.isEmpty() && !visited[m]) {
                int now = q.poll();
                int D = (2*now) % 10000;
                int S = (now == 0) ? 9999 : now-1 ;
                int L = (now % 1000* 10 + now/1000;
                int R = (now % 10* 1000 + now/10;    
                
                System.out.println(L+" "+R);
                if(!visited[D]) {
                    q.add(D);
                    visited[D] = true;
                    command[D] = command[now]+"D";
                }
                if(!visited[S]) {
                    q.add(S);
                    visited[S] = true;
                    command[S] = command[now]+"S";
                }
                if(!visited[L]) {
                    q.add(L);
                    visited[L] = true;
                    command[L] = command[now]+"L";
                }
                if(!visited[R]) {
                    q.add(R);
                    visited[R] = true;
                    command[R] = command[now]+"R";
                }
            }
            System.out.println(command[m]);
        }
    }
 
}
 
 

'Algorithm' 카테고리의 다른 글

백준 1120 문자열 Java  (0) 2019.06.10
백준 1525 퍼즐 Java  (0) 2019.06.09
백준 1963 소수 경로 Java  (0) 2019.06.08
완전 탐색(exhaustive - search)의 종류  (0) 2019.06.07
백준 6603 로또 Java  (0) 2019.06.07