● 문제출처
●정리(요약)
스도쿠는 가로,세로 1~9 숫자 반복이 없어야하며, 3*3 작은 격자 또한 1~9 숫자 반복이 없어야한다.
겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
●코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Solution
{
static int [][] arr ;
static boolean [] check;
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int i = 1; i<=T ; i++) {
arr= new int [10][10];
int [][] C = new int [10][10];
int answer = 1;
for(int j=1; j<10;j++) {
st= new StringTokenizer(br.readLine());
int sum = 0;
if(answer!=0) {
for(int k =1; k<10; k++){
arr[j][k]=Integer.parseInt(st.nextToken());
C[j][k]=arr[j][k]+C[j-1][k]+C[j][k-1]-C[j-1][k-1];
sum+=arr[j][k];
}
}
// 가로 검사
if(sum!=45) {
answer = 0;
}
}
if(answer==0) {
sb.append("#").append(i).append(" ").append(answer).append("\n");
continue;
}
//세로 검사
for(int j = 1; j<10; j++) {
int sum = 0;
if(answer!=0) {
for(int k=1; k<10; k++) {
sum+=arr[k][j];
}
}
if(sum!=45) {
answer=0;
break;
}
}
if(answer==0) {
sb.append("#").append(i).append(" ").append(answer).append("\n");
continue;
}
for(int j=3; j<10;j=j+3) {
for(int k=3; k<10; k=k+3) {
if(C[j][k]-C[j-3][k]-C[j][k-3]+C[j-3][k-3]!=45) {
answer=0;
break;
}
}
if(answer==0) {
break;
}
}
sb.append("#").append(i).append(" ").append(answer).append("\n");
}
System.out.println(sb.toString());
}
}
● 느낀점
합이 45라는 규칙을 통해 구하였다. 가로는 입력을 받을 때, 세로는 반복문을 통하여, C(해당 인덱스까지의 합)을 이용하여 3*3 칸의 합을 구하였다.
다른 방식을 이용해서 풀까 생각했지만 9*9배열이 10개만 만들면 되어서 시간안에 풀 거 같아 합이 45라는 규칙을 사용하였다.