[java]스도쿠 검증 - SWEA 1974

풀이

문제 해석을 하자면,

  • 실제 스도쿠 게임처럼 숫자가 중복되지 않고 잘 성립하는지 묻는 문제이다.


풀이

  • 2가지를 진행하자
    • 완전탐색으로 전체 9*9 가로,세로 확인
    • 각각 3*3 사각형 전체 확인
  • 참, 거짓 판단하는 시점만 잘 신경써주자
  • 특히, countVisit 배열에 1~9 숫자 조회 횟수를 기록하여 해결한다.



코드

import java.io.*;
import java.util.*;
public class 스도쿠검증_1974 {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();
    int T = Integer.parseInt(br.readLine());
    for(int t=1; t<=T; t++) {
      //input
      int N=9;
      int[][] inArr = new int[N][N]; // 매번 새로 할당
      for(int i=0; i<N; i++) {
        StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
        for(int j=0; j<N; j++) {
          inArr[i][j] = Integer.parseInt(stk.nextToken());
        }
      }
      //run
      int result = 1;
      // 1. 9x9 가로,세로
      int[] countVisit = new int[N+1]; //init
      for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
          // 가로와 세로 한번에 확인하기
          countVisit[inArr[i][j]]++;
          countVisit[inArr[j][i]]++;
        }
        // 가로세로 참,거짓 판단
        for(int k=1; k<=N; k++) {
          if(countVisit[k] != 2*(i+1)) {
            result = 0; // false
          }
        }
      }
      // 2. 3x3사각형
      if(result == 1) {
        countVisit = new int[N+1]; //init
        int cx=0; int cy=0; int idx=1;
        while(true) {
          if(cy>=9) {
            cx+=3; cy=0;
            if(cx>=9) break; // 탈출 시점
          }
          for (int i = cx; i < cx+3; i++) {
            for (int j = cy; j < cy+3; j++) {
              countVisit[inArr[i][j]]++;
            }
          }
          // 3x3사각형 참,거짓 판단
          for(int k=1; k<=N; k++) {
            if(countVisit[k] != idx) {
              result = 0; // false
            }
          }
          idx++;
          cy+=3; // update
        }
      }
      //output
      sb.append("#"+t+" "+result+"\n");
    }
    System.out.print(sb);
  }
}



느낀점

생략

댓글남기기