백트래킹을 사용했다.
백준 2580 : https://www.acmicpc.net/problem/2580
문제와 99% 동일하다. 딱 하나 다른 건 거기서는 정답이 여러개일 경우 아무거나 출력하면 됐지만 여기서는 사전 순으로 가장 앞서는 것을 출력한다.
사실 map을 1~9로 차례대로 보고 가지치기한다면 동일한 결과를 얻는다.
그러므로 한 번 푼 문제를 다시 푸는 거라고도 할 수 있겠다.
2주 전쯤 풀었었던 것 같은데 당시에는 문제를 풀지 못해서 다른 사람의 풀이를 참고했었다.
import java.util.*;
import java.io.*;
public class Main {
static int map[][]=new int[9][9];
static ArrayList<Integer[]> list=new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
for(int i=0;i<map.length;i++) {
String line[]=br.readLine().split("");
for(int j=0;j<map.length;j++) {
map[i][j]=Integer.parseInt(line[j]);
if(map[i][j]==0)
list.add(new Integer[] {i,j});
}
}
backtracking(0);
}
public static void backtracking(int depth) {
if(depth==list.size()) {
for(int i=0;i<map.length;i++) {
for(int j=0;j<map.length;j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
System.exit(0);
}
Integer temp[]=list.get(depth);
int y=temp[0];
int x=temp[1];
for(int i=1;i<=9;i++) {
if(check(y,x,i)) {
map[y][x]=i;
backtracking(depth+1);
map[y][x]=0;
}
}
}
public static boolean check(int y,int x,int value) {
for(int i=0;i<map.length;i++) {
if(map[y][i]==value) return false;
if(map[i][x]==value) return false;
}
int standardY=y/3*3;
int standardX=x/3*3;
for(int i=standardY;i<standardY+3;i++) {
for(int j=standardX;j<standardX+3;j++) {
if(map[i][j]==value) return false;
}
}
return true;
}
}
good!
계속 새로운 문제를 푸는 것도 좋지만 이전에 한 번 실패했던 문제를 1~2주 뒤 다시 풀어보는 것도 좋은 것 같다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212