SWEA(SW Expert Academy) 1974. 스도쿠 검증 D2

heesan·2024년 10월 2일

코딩테스트

목록 보기
7/40

● 문제출처

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE&problemTitle=1974&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=1

●정리(요약)
스도쿠는 가로,세로 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라는 규칙을 사용하였다.

profile
👩‍💻Backend Engineering

0개의 댓글