반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

풀이방법

스도쿠가 맞는지 검증하면 된다.

1. 가로에 1~9 스도쿠를 만족하는지 검증(true)

2. 세로 검증(true)

3. 3X3 검증(true)

셋 중 하나라도 false가 있을 시 0을 출력하고, 스도쿠가 맞다면 1을 출력.

느낀점

사실상 연산보다 익숙하지 않은 자바의 입력값에서 시간을 쏟아 붓게된다. 자바의 입력값 중 Scanner는 공백 입력값을 자동으로 구분하여 처리해줘서 편리하지만, 현재 내가 학습 중인 방법에선 BufferdReader가 더 속도가 빠른 측면이 있어 BufferedReader 입력을 쓰는 것을 선호한다.

대신 BufferedReader를 사용할 경우 코드가 더 길어진다. 특히 문자열만 지원하기에 다른 자료형일 경우 형변환을 해줘야한다.

이를 보완하기 위해 또 다른 방법을 찾았는데 그것은 StringTokenizer이다.

StringTokenizer 보통 BufferdReader와 같이 쓰이며 공백 기준으로 여러 데이터를 입력받을 때 유용하게 쓰인다.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
import java.util.StringTokenizer;

public class Solution {

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T;
		T = Integer.parseInt(in.readLine());
		//T번 반복
		for(int i=1;i<=T;i++) {
			sb.append("#" + i + " ");
			
			boolean check = true; // true면 1, false면 0
			//스도쿠 만들기(9줄)
			int[][] sudoku = new int[9][9];
			for(int j=0;j<9;j++) {
				StringTokenizer st = new StringTokenizer(in.readLine());
				for(int k=0;k<9;k++) {
					sudoku[j][k] = Integer.parseInt(st.nextToken());
				}
			}
			
			//가로 검증
			for(int j=0;j<9;j++) {
				int[] verify = new int[9]; //1~9번 숫자 검증
				for(int k=0;k<9;k++) {
					verify[sudoku[j][k]-1] = 1;
				}
				//검증
				for(int l=0;l<9;l++) {
					if (verify[l] == 0) {
						check = false;
						break;
					}
				}
			}
			
			//세로 검증
			for(int j=0;j<9;j++) {
				int[] verify = new int[9]; //1~9번 숫자 검증
				for(int k=0;k<9;k++) {
					verify[sudoku[k][j]-1] = 1;
				}
				//검증
				for(int l=0;l<9;l++) {
					if (verify[l] ==0) {
						check = false;
						break;
					}
				}
			}
			
			//3x3검증
			for(int j=0;j<9;j+=3) {
				for(int k=0;k<9;k+=3) {
					int[] verify = new int[9]; //1~9번 숫자 검증
					for(int l=0;l<3;l++) {
						for(int m=0;m<3;m++) {
							verify[sudoku[j+l][k+m]-1] = 1;
						}
					}
					for(int n=0;n<9;n++) {
						if (verify[n] == 0) {
							check = false;
							break;
						}
					}
				}
			}
			if (check == true) {
				sb.append(1).append("\n");
			} else {
				sb.append(0).append("\n");
			}
		}
		System.out.println(sb);
	}
}

+ Recent posts