반응형
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);
}
}
'알고리즘' 카테고리의 다른 글
[SWEA] 1961. 숫자 배열 회전 : JAVA (3) | 2023.01.15 |
---|---|
[Bronze III] 도미노 - 2921 : JAVA (2) | 2023.01.14 |
[SWEA] 1204. [s/w 문제해결 기본] 1일차 - 최빈수 구하기 : JAVA (3) | 2023.01.12 |
[Bronze III] 이게 분수? - 2863 (구현) (3) | 2023.01.11 |
[Silver II] 용돈 관리 - 6236 (이분 탐색) (5) | 2023.01.10 |