이전 BFS보다는 살짝 까다로운 문제이다.
지나온 루트를 저장해야하기 때문에 pre_num -> 현재 수 이전에 지나친 수를 저장하는 배열,
pre_com -> 현재 수에 도달하기 위해 수행한 명령어를 저장하는 배열을 추가로 선언해주었다.
출력은 Stack의 후입선출방식을 활용하였다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Set; import java.util.Stack; class Main{ public static void main(String[] args) throws IOException { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); int T=Integer.parseInt(in.readLine()); for(int c=0; c<T; c++) { String input=in.readLine(); int SN=Integer.parseInt(input.split(" ")[0]); int BN=Integer.parseInt(input.split(" ")[1]); int[] pre_num=new int[10000]; char[] pre_com=new char[10000]; Queue<Integer> queue=new LinkedList<>(); //초기화 pre_num[SN]=-1;//SN의 이전 숫자는 -1 pre_com[SN]='X';//SN으로 오기 위해 선택한 명령어는 X queue.add(SN); while(!queue.isEmpty()) { int now=queue.poll(); if(now==BN) { Stack<String> stack=new Stack<String>(); char ch;//현재 숫자를 오기 위해 거친 명령어 while(pre_num[now]!=-1) { ch=pre_com[now]; stack.add(Character.toString(ch)); now=pre_num[now]; } while(!stack.isEmpty()) { System.out.print(stack.pop()); } System.out.println(); break; } //D if(now*2 >9999 && pre_com[(now*2)%10000]=='\0') { queue.add((now*2)%10000); pre_num[(now*2)%10000]=now; pre_com[(now*2)%10000]='D'; } else if(now*2 < 10000 && pre_com[now*2]=='\0') { queue.add(now*2); pre_num[now*2]=now; pre_com[now*2]='D'; } //S if(now==0 && pre_com[9999]=='\0') { queue.add(9999); pre_num[9999]=now; pre_com[9999]='S'; } else if(now!=0 && pre_com[now-1]=='\0') { queue.add(now-1); pre_num[now-1]=now; pre_com[now-1]='S'; } //L int ln= (now%10)*10+(now/10%10)*100 +(now/100%10)*1000+(now/1000); if(pre_com[ln]=='\0') { queue.add(ln); pre_num[ln]=now; pre_com[ln]='L'; } //R int rn=(now%10)*1000+(now/10%10) +(now/100%10)*10+(now/1000)*100; if(pre_com[rn]=='\0') { queue.add(rn); pre_num[rn]=now; pre_com[rn]='R'; } } } in.close(); }
'이론 > 문제풀이' 카테고리의 다른 글
[백준알고리즘 -2251] 물통 -java(BFS) (0) | 2018.08.27 |
---|---|
[백준알고리즘 -1525] 퍼즐 - java (BFS) (0) | 2018.08.27 |
[백준알고리즘 -1697] 숨바꼭질 - Java(BFS) (0) | 2018.08.26 |
[백준 알고리즘 - 6603] 로또 -java(중복된 수가 있는 집합의 순열) +(20180901 백트래킹 코드 추가) (0) | 2018.08.23 |
[백준-10992] 별 찍기 17 -Java (0) | 2018.08.16 |