본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 1974 스도쿠 검증

by 까망 하르방 2021. 3. 1.
반응형

출처: SWEA

 Input 
10
7 3 6 4 2 9 5 8 1
5 8 9 1 6 7 3 2 4
2 1 4 5 8 3 6 9 7
8 4 7 9 3 6 1 5 2
1 5 3 8 4 2 9 7 6
9 6 2 7 5 1 8 4 3
4 2 1 3 9 8 7 6 5
3 9 5 6 7 4 2 1 8
6 7 8 2 1 5 4 3 9

 Output 

#1 1

스도쿠 검증하는 문제이다.

9x9판에서 아래 구간을 for문으로 차례대로 검사.

각 구간별로 1~9까지 숫자가 중복없이 있는지 확인.

 


import java.util.Scanner;
 
public class Solution {
      
    static int tc;
    static int[][] arr;
    static boolean[] target;
      
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = Integer.parseInt(sc.next());
         
        arr = new int[10][10];
        for(tc=1; tc<=T; tc++) {
         // 1행부터 시작해서 모든 열의 숫자를 입력 받는다.  (9x9)
         for(int i=1; i<=9; i++) {
              for(int j=1; j<=9; j++) {
                  arr[i][j] =  Integer.parseInt(sc.next());
              }
         }
          
         // 모든 검사를 통과해야 true로 남아 있다.
         boolean answer = true;
          
         // 모든 행,열에 대해 검사
         if(checkLine()) {
              printFalseAnswer();
              // 다음 TestCase에 대해서 진행
              continue;
         }
         // 각 격자에 대한 검사
         if(checkGrid()) {
              printFalseAnswer();
              // 다음 TestCase에 대해서 진행
              continue;
         }
          
         System.out.print("#" + tc + " ");
         System.out.println("1");
        }
    }
     
     private static boolean checkLine() {
          
         // 1~9까지의 숫자를 의미
         target = new boolean[10];
      
         for(int i=1; i<=9; i++) {
              // 하나의 행에 대한 모든 열을 살핀다.
         for(int j=1; j<=9; j++) {
              // 숫자가 중복되었다면 종료
              if(target[arr[i][j]]) {
                  return true;
              }
              target[arr[i][j]] = true;
         }
         // 재검사를 위해 다시 초기화 시켜준다.
         target = new boolean[10];
          
          
         // 하나의 열에 대한 모든 행을 살핀다.
         for(int j=1; j<=9; j++) {
              // 숫자가 중복되었다면 종료
              if(target[arr[j][i]]) {
                  return true;
              }
              target[arr[j][i]] = true;
         }
         // 재검사를 위해 다시 초기화 시켜준다.
         target = new boolean[10];
     }
         // 모든 라인 검사에 문제가 없다면.
         return false;
     }
     private static boolean checkGrid() {
         int[][] index = {
              {2,2}, {2,5}, {2,8},
              {5,2}, {5,5}, {5,8},
              {8,2}, {8,5}, {8,8}
         };
          
         int[] change_x = {-1,-1,-1, 0, 0, 0, 1, 1, 1};
         int[] change_y = {-1,0,1, -1,0,1, -1,0,1};
          
          
         // 1~9까지의 숫자를 의미
         target = new boolean[10];
          
         for(int idx=0; idx<9; idx++) {
              int mid_x = index[idx][0];
              int mid_y = index[idx][1];
               
              for(int i=0; i<9; i++) {
                  int next_x = mid_x + change_x[i];
                  int next_y = mid_y + change_y[i];
                   
                  if(target[arr[next_x][next_y]]) {
                  return true;
                  }
              target[arr[next_x][next_y]] = true;
              }
               
              // 재검사를 위해 다시 초기화 시켜준다.
         target = new boolean[10];
         }
         return false;
     }
 
     private static void printFalseAnswer() {
         System.out.print("#" + tc + " ");
         System.out.println("0");
     }
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 1249 보급로  (0) 2021.03.01
[SWEA] 8382 방향 전환  (0) 2021.03.01
[SWEA] 1954 달팽이  (0) 2021.03.01
[SWEA] 3816 아나그램  (0) 2021.03.01
[SWEA] 3819 최대 부분 배열  (0) 2021.02.28

댓글