소요시간
20분 보다가 BFS 로 풀어야 하는 것은 알았는데 어떤 방식으로 접근해야 할지 모르겠어서 다른 분들의 블로그를 참고했다.
그렇게 10분 정도 풀이를 보고 직접 구현해봤다.
30분 걸렸고, 그렇게 도합 1시간이 걸렸다.
사용한 자료구조 & 알고리즘
해시맵, BFS 를 사용했다. 해시맵은 bfs 의 visited 배열 같은 요소로, 내가 탐색하는 것이 이전에 이미 탐색했던 숫자라면 continue 해주는 용도로 사용.
전체적인 알고리즘은 BFS 를 사용해서 완전탐색했다.
풀이과정
예외 처리
소스코드
import java.io.*;
import java.util.*;
import java.math.BigInteger;
public class Main{
static int arr[][]=new int[3][3];
static int yy[]= {-1,1,0,0};
static int xx[]= {0,0,-1,1};
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int number=0;
for(int i=0;i<3;i++) {
String line[]=br.readLine().split(" ");
for(int j=0;j<3;j++) {
arr[i][j]=Integer.parseInt(line[j]);
if(arr[i][j]==0) arr[i][j]=9;
number=number*10+arr[i][j];
}
}
System.out.println(bfs(number));
}
public static int bfs(int number) {
HashMap<Integer,Integer> map =new HashMap<>();
Queue<Integer> queue=new LinkedList<>();
map.put(number,0);
queue.add(number);
int answer=123456789;
while(!queue.isEmpty()) {
int before=queue.poll();
if(before==answer) {
return map.get(answer);
}
String temp=Integer.toString(before);
int index=0;
for(int i=0;i<temp.length();i++) {
if(temp.charAt(i)-'0'==9) {
index=i;
break;
}
}
int y=index/3;
int x=index%3;
for(int i=0;i<4;i++) {
int nextY=y+yy[i];
int nextX=x+xx[i];
int changeIndex=nextY*3+nextX;
if(nextY<0||nextX<0||nextY>=3||nextX>=3)
continue;
StringBuilder sb=new StringBuilder(temp);
char changeCh=temp.charAt(changeIndex);
sb.setCharAt(index, changeCh);
sb.setCharAt(changeIndex, '9');
if(map.containsKey(Integer.parseInt(sb.toString()))) continue;
int next=Integer.parseInt(sb.toString());
map.put(next,map.get(before) +1);
queue.add(next);
}
}
return -1;
}
}
결과
회고 & 새롭게 알게 된 것
1문제를 푸는데 이렇게 많은 것을 알아간다니 진짜 알차다.
매번 똑같은 유형의 문제 말고 이런 이색적인 문제를 푸는 것이 즐겁다.
하루에 백준 1문제 이상 푸는 것을 목표로하고 있다.