728x90
반응형
2024.08.16기준 - 실버4
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 완성된 스도쿠 판이 입력되었을 때, 올바르다면 "CORRECT"을 아니라면 "INCORRECT"을 출력하는 문제입니다.
1. 입력 받은 스도쿠 판을 배열에 저장해 주었습니다.
// 입력받은 값 저장
for (int i = 0; i < 9; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 9; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
2. 입력 받은 스도쿠 판에서 행과 열의 좌표를 하나 씩 올려주면 세로와 가로를 같이 체크를 해주었습니다.
check = true;
// 가로 한 줄, 세로 한줄 확인하는 메서드 호출
for (int i = 0; i < 9; i++) {
if (!LRcheck(i)) {
check = false;
break;
}
}
체크를 위한 함수 생성.
// 세로, 가로 한 줄을 체크하는 함수.
private static boolean LRcheck(int index) {
boolean[] check = new boolean[10];
for (int i = 0; i < 9; i++) {
if (check[map[index][i]]) {
return false;
} else {
check[map[index][i]] = true;
}
}
check = new boolean[10];
for (int i = 0; i < 9; i++) {
if (check[map[i][index]]) {
return false;
} else {
check[map[i][index]] = true;
}
}
return true;
}
이렇게 0부터 8까지의 인덱스만 있어도 동시에 가로와 세로를 전부 다 계산이 가능하도록 설계했습니다.
3. 행과 열을 검사 후 전부 다 가능한 스도쿠라면 3x3의 범위를 검사를 합니다.
// 올바르지 않다면
if (!check) {
sb.append("INCORRECT\n");
continue;
} else { // 올바르다면 다음 3x3 체크
for (int i = 0; i <= 6; i += 3) {
for (int j = 0; j <= 6; j += 3) {
if (!TTcheck(i, j)) {
check = false;
break;
}
if (!check) {
break;
}
}
}
// 올바르지 않다면
if (!check) {
sb.append("INCORRECT\n");
// 올바르다면
} else {
sb.append("CORRECT\n");
}
}
3x3의 공간을 확인하기 위해 함수를 생성합니다.
// 3x3을 체크하는 함수
private static boolean TTcheck(int y, int x) {
boolean[] check = new boolean[10];
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (check[map[i][j]]) {
return false;
} else {
check[map[i][j]] = true;
}
}
}
return true;
}
4. 전부 다 통과를 한다면 올게 아니라면 올지 않게 출력을 해줍니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine()); // 테스트 케이스 개수
boolean check;
StringTokenizer st;
for (int cs = 1; cs <= t; cs++) {
// 케이스 순서 별로 출력
sb.append("Case " + cs + ": ");
map = new int[9][9];
// 한 줄 씩 띄어져 있다
if (cs > 1) {
br.readLine();
}
// 입력받은 값 저장
for (int i = 0; i < 9; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 9; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
check = true;
// 가로 한 줄, 세로 한줄 확인하는 메서드 호출
for (int i = 0; i < 9; i++) {
if (!LRcheck(i)) {
check = false;
break;
}
}
// 올바르지 않다면
if (!check) {
sb.append("INCORRECT\n");
continue;
} else { // 올바르다면 다음 3x3 체크
for (int i = 0; i <= 6; i += 3) {
for (int j = 0; j <= 6; j += 3) {
if (!TTcheck(i, j)) {
check = false;
break;
}
if (!check) {
break;
}
}
}
// 올바르지 않다면
if (!check) {
sb.append("INCORRECT\n");
// 올바르다면
} else {
sb.append("CORRECT\n");
}
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
// 세로, 가로 한 줄을 체크하는 함수.
private static boolean LRcheck(int index) {
boolean[] check = new boolean[10];
for (int i = 0; i < 9; i++) {
if (check[map[index][i]]) {
return false;
} else {
check[map[index][i]] = true;
}
}
check = new boolean[10];
for (int i = 0; i < 9; i++) {
if (check[map[i][index]]) {
return false;
} else {
check[map[i][index]] = true;
}
}
return true;
}
// 3x3을 체크하는 함수
private static boolean TTcheck(int y, int x) {
boolean[] check = new boolean[10];
for (int i = y; i < y + 3; i++) {
for (int j = x; j < x + 3; j++) {
if (check[map[i][j]]) {
return false;
} else {
check[map[i][j]] = true;
}
}
}
return true;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 29891번 체크포인트 달리기 (0) | 2024.08.18 |
---|---|
BEAKJOON / 백준 - JAVA 3097번 산책 경로 (0) | 2024.08.17 |
BEAKJOON / 백준 - JAVA 7662번 이중 우선순위 큐 (0) | 2024.08.15 |
BEAKJOON / 백준 - JAVA 30618번 donstructive (0) | 2024.08.14 |
BEAKJOON / 백준 - JAVA 9613번 GCD 합 (0) | 2024.08.13 |