반응형
```
백준 9291번 스도쿠 채점 JAVA 구현해보기
```
이번 글을 통해 배워갈 내용
- 백준 9291번 풀이
- 수도쿠 채점 프로그램
https://www.acmicpc.net/problem/9291
9291번: 스도쿠 채점
각 테스트 케이스에 걸쳐 "Case x:"를 출력한 후, 공백 한 칸 뒤에 풀이가 올바르면 "CORRECT"를, 아니면 "INCORRECT"를 출력한다. x는 테스트 케이스 번호이며, 1부터 시작한다.
www.acmicpc.net
백준 9291번 스도쿠 채점은
난이도 실버 등급의 문제로서
수독(數獨) SUDOKU 채점을 해주면 되는 프로그램입니다.
스토쿠는 9X9 퍼즐 판에 아래 3가지 조건을 만족해주면 되는 퍼즐입니다.
각 정수 1-9는 각 행에 정확히 한 번씩 등장
각 정수 1-9는 각 열에 정확히 한 번씩 등장
각 정수 1-9는 각 작은 3x3 정사각형에 정확히 한 번씩 등장
테스트 케이스만큼 스토쿠 퍼즐의 답안을 받고
스토쿠 조건을 만족하면 CORRECT 틀리면
INCORRECT를 출력하면 됩니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
입력을 받고 위에 3가지 경우에 맞춰서
확인해주고
그에 맞게 출력해주면 되는 문제입니다.
답을 푸는 방법은 여러 가지가 있겠지만
저는 검증을 하는 부분을 bool 배열을 사용해서
풀었습니다.
private static boolean isValid(List<Integer> nineNumbers) {
boolean isValid = true;
boolean[] checkArr = new boolean[9];
nineNumbers.forEach(num -> checkArr[num - 1] = true);
for (int i = 0; i < 9; i++) {
if (!checkArr[i]) {
isValid = false;
break;
}
}
return isValid;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int testCase = Integer.parseInt(br.readLine());
for (int idx1 = 0; idx1 < testCase; idx1++) {
// 입력
int[][] arr = initSudokuArr();
//각 정수 1-9는 각 행에 정확히 한 번씩 등장해야 한다.
boolean isCorrect = rowValidation(arr);
//각 정수 1-9는 각 열에 정확히 한 번씩 등장해야 한다.
if (isCorrect) {
isCorrect = columnValidation(arr);
}
//각 정수 1-9는 각 작은 3x3 정사각형에 정확히 한 번씩 등장해야 한다.
if (isCorrect) {
isCorrect = squareValidation(arr);
}
String output = "CORRECT";
if (!isCorrect) {
output = "INCORRECT";
}
System.out.println("Case " + (idx1 + 1) + ": " + output);
// 공백
br.readLine();
}
}
private static boolean squareValidation(int[][] arr) {
for (int idx2 = 0; idx2 < 3; idx2++) {
for (int idx3 = 0; idx3 < 3; idx3++) {
List<Integer> nineNumbers = new ArrayList<>();
for (int idx4 = 0; idx4 < 3; idx4++) {
for (int idx5 = 0; idx5 < 3; idx5++) {
nineNumbers.add(arr[idx4 + (idx2 * 3)][idx5 + (idx3 * 3)]);
}
}
if (!isValid(nineNumbers)) {
return false;
}
}
}
return true;
}
private static boolean columnValidation(int[][] arr) {
for (int idx2 = 0; idx2 < 9; idx2++) {
List<Integer> nineNumbers = new ArrayList<>();
for (int idx3 = 0; idx3 < 9; idx3++) {
nineNumbers.add(arr[idx3][idx2]);
}
if (!isValid(nineNumbers)) {
return false;
}
}
return true;
}
private static boolean rowValidation(int[][] arr) {
for (int idx2 = 0; idx2 < 9; idx2++) {
List<Integer> nineNumbers = new ArrayList<>();
for (int idx3 = 0; idx3 < 9; idx3++) {
nineNumbers.add(arr[idx2][idx3]);
}
if (!isValid(nineNumbers)) {
return false;
}
}
return true;
}
private static int[][] initSudokuArr() throws IOException {
int[][] arr = new int[9][9];
for (int idx2 = 0; idx2 < 9; idx2++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int idx3 = 0; idx3 < 9; idx3++) {
arr[idx2][idx3] = Integer.parseInt(st.nextToken());
}
}
return arr;
}
private static boolean isValid(List<Integer> nineNumbers) {
boolean isValid = true;
boolean[] checkArr = new boolean[9];
nineNumbers.forEach(num -> checkArr[num - 1] = true);
for (int i = 0; i < 9; i++) {
if (!checkArr[i]) {
isValid = false;
break;
}
}
return isValid;
}
}
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
728x90
반응형
'Java > Java 알고리즘' 카테고리의 다른 글
백준 17256번 달달함이 넘쳐흘러 JAVA 구현해보기 (0) | 2022.02.04 |
---|---|
백준 10539번 수빈이와 수열 JAVA 구현해보기 (0) | 2022.02.04 |
백준 9076번 점수집계 JAVA 구현해보기 (0) | 2022.02.04 |
백준 14492번 부울행렬의 부울곱 JAVA 구현해보기 (0) | 2022.02.03 |
백준 9085번 더하기 JAVA 구현해보기 (0) | 2022.02.03 |