본문 바로가기
알고리즘/백준

[Java] BOJ 2580번 스도쿠

by 컴공맨 2021. 7. 20.
 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net


풀이

재귀함수를 사용하여 해결했습니다.

이때, 스도쿠가 성립하는 경우가 여러개이므로 맨 처음 완성된 스도쿠만 출력하고 바로 종료하게하였습니다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static int[][] board;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		board = new int[9][9];
		
		for (int i = 0; i < 9; ++i) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < 9; ++j) {
				board[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		go(0, 0);
	}
	
	public static void go(int y, int x) {
		if (y == 9) {
			// 여러가지의 경우가 나올 수 있기때문에 처음 발견하면 출력하고 바로 정지한다.
			StringBuilder sb = new StringBuilder("");
			
			for (int i = 0; i < 9; ++i) {
				for (int j = 0; j < 9; ++j) {
					sb.append(board[i][j]).append(" ");
				}
				sb.append("\n");
			}
			
			System.out.println(sb);
			
			System.exit(0);
		}
		
		if (x == 9) {
			go(y + 1, 0);
			return;
		}
		
		if (board[y][x] == 0) {
			for (int i = 1; i <= 9; ++i) {
				if (!row(y, i) || !col(x, i) || !sqaure(y, x, i)) {
					continue;
				}
				
				board[y][x] = i;
				go(y, x + 1);
			}
			
			// 만약 모든 숫자를 다 넣었어도 안되는 경우가 있기때문에
			// 다시 이전 상태로 돌아가서 다음 검사를 하기 위해 다시 초기화
			board[y][x] = 0;
		}
		else {
			go(y, x + 1);
		}
	}
	
	// 가로 검사
	public static boolean row(int y, int num) {
		for (int i = 0; i < 9; ++i) {
			if (board[y][i] == num) {
				return false;				
			}
		}
		
		return true;
	}
	
	// 세로 검사
	public static boolean col(int x, int num) {
		for (int i = 0; i < 9; ++i) {
			if (board[i][x] == num) {
				return false;
			}
		}
		
		return true;
	}
	
	// 사각형 검사
	public static boolean sqaure(int y, int x, int num) {
		int ny = (y / 3) * 3;
		int nx = (x / 3) * 3;
		
		for (int i = ny; i < ny + 3; ++i) {
			for (int j = nx; j < nx + 3; ++j) {
				if (board[i][j] == num) {
					return false;
				}
			}
		}
		
		return true;
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 1520번 내리막 길  (0) 2021.07.23
[Java] BOJ 1717번 집합의 표현  (0) 2021.07.21
[Java] BOJ 1987번 알파벳  (0) 2021.07.19
[Java] BOJ 9084번 동전  (2) 2021.07.16
[Java] BOJ 13023번 ABCDE  (0) 2021.07.15