일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 개발자취미
- #알고리즘 #백준 #1987 #백준1987 #algorithm #baekjoon #baekjoon1987 #Java
- #알고리즘 #백준 #17136 #백준17136 #algorithm #baekjoon #baekjoon17136 #C++
- #알고리즘 #백준 #1793 #백준1793 #algorithm #baekjoon #baekjoon1793 #C++
- 책리뷰
- #알고리즘 #백준 #17406 #백준17406 #algorithm #baekjoon #baekjoon17406 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #괄호변환 #programmers #C++
- CleanCode
- 클린코드
- #알고리즘 #백준 #1260 #백준1260 #algorithm #baekjoon #baekjoon1260 #Java
- #알고리즘 #백준 #12094 #백준12094 #algorithm #baekjoon #baekjoon12094 #C++
- #알고리즘 #백준 #2580 #백준2580 #algorithm #baekjoon #baekjoon2580 #Java
- #알고리즘 #백준 #17837 #백준17837 #algorithm #baekjoon #baekjoon17837 #C++
- #알고리즘 #백준 #2573 #백준2573 #algorithm #baekjoon #baekjoon2573 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #블록이동하기 #programmers #C++
- #알고리즘 #백준 #14888 #백준14888 #algorithm #baekjoon #baekjoon14888 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #외벽점검 #programmers #C++
- 개발서
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #문자열압축 #programmers #C++
- #알고리즘 #백준 #2616 #백준2616 #algorithm #baekjoon #baekjoon2616 #Java
- #알고리즘 #백준 #2352 #백준2352 #algorithm #baekjoon #baekjoon2352 #C++
- #알고리즘 #백준 #3190 #백준3190 #algorithm #baekjoon #baekjoon3190 #C++
- #알고리즘 #백준 #15684 #백준15684 #algorithm #baekjoon #baekjoon15684 #C++
- #알고리즘 #백준 #15683 #백준15683 #algorithm #baekjoon #baekjoon15683 #C++
- 스레드 #동시성 #thread #process #
- #알고리즘 #백준 #17140 #백준17140 #algorithm #baekjoon #baekjoon17140 #C++
- #알고리즘 #백준 #1525 #백준1525 #algorithm #baekjoon #baekjoon1525 #C++
- #알고리즘 #백준 #17472 #백준17472 #algorithm #baekjoon #baekjoon17472 #C++
- #알고리즘 #백준 #5214 #백준5214 #algorithm #baekjoon #baekjoon5214 #C++
- #알고리즘 #백준 #4386 #백준4386 #algorithm #baekjoon #baekjoon4386 #C++
Archives
- Today
- Total
개발자 일기장.
백준 2580. 스도쿠 본문
2580 스도쿠
문제해결 사진
문제 알고리즘
- dfs
- 백트래킹
풀이방법
- 넣을 수 있는 빈칸을 체크한다
- 해당 빈칸에 수 하나씩 넣으면서 가능한지 확인하고, 가능 한 경우 다음 빈칸을 확인한다
- 불가능인 경우 해당 수를 다른 수로 바꾼다.
- 핵심 코드
import java.util.*;
class pos{
int y;
int x;
public pos(int y, int x) {
this.y = y;
this.x = x;
}
}
public class Main {
static final int MAX = 9;
static int board[][] = new int[MAX][MAX];
static ArrayList<pos> blankList = new ArrayList<>(); // 빈칸 위치
static void dfs(ArrayList<pos> arr, int idx) {
if(idx == blankList.size()) {
for(int i=0; i<MAX; i++) {
for(int j=0; j<MAX; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println("");
}
System.exit(0);
}
// 1~9까지 적합한지 가능성 확인
for(int i=1; i<=MAX; i++) {
if(isValidPos(arr, idx, i)) {
board[arr.get(idx).y][arr.get(idx).x] = i;
dfs(arr, idx + 1);
}
if(i == MAX)
board[arr.get(idx).y][arr.get(idx).x] = 0;
}
}
static boolean isValidPos(ArrayList<pos> arr, int idx, int num) {
for(int j=0; j<MAX; j++) { // 가로
if(arr.get(idx).x == j)
continue;
if(board[arr.get(idx).y][j] == num)
return false;
}
for(int i=0; i<MAX; i++) { // 세로
if(arr.get(idx).y == i)
continue;
if(board[i][arr.get(idx).x] == num)
return false;
}
int y = (arr.get(idx).y/3) * 3;
int x = (arr.get(idx).x/3) * 3;
for(int i=y; i<y+3; i++) {
for(int j=x; j<x+3; j++) {
if(i == arr.get(idx).y && j == arr.get(idx).x)
continue;
if(board[i][j] != 0 && board[i][j] == num)
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 스도쿠 board 채우기
for(int i=0; i<MAX; i++)
for(int j=0; j<MAX; j++)
board[i][j] = sc.nextInt();
// 스도쿠 빈칸을 Array List에 저장
for(int i=0; i<MAX; i++)
for(int j=0; j<MAX; j++)
if(board[i][j] == 0)
blankList.add(new pos(i, j));
//for(int i=0; i<MAX; i++)
// System.out.print(blankList.get(i).y + ", " + blankList.get(i).x + " ");
//System.out.println("");
// dfs, 0번째 인덱스부터 스도쿠 판을 채워간다.
dfs(blankList, 0);
}
}
문제 후 느낀점
- 오랜만에 java로 코딩
'취업 > Algorithm.' 카테고리의 다른 글
백준 3190. 뱀 (0) | 2020.05.30 |
---|---|
백준 2616. 소형기관차 (0) | 2020.05.30 |
백준 2532. 반도체 설계 (0) | 2020.05.30 |
백준 1987. 알파벳 (0) | 2020.05.30 |
백준 1793. 타일링 (0) | 2020.05.30 |