OD
[SWEA D2 JAVA] 1974 스도쿠 검증 본문
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
package hw;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class Hw220217_SWEA_1974_스도쿠검증 {
static Stack<Integer> stk = new Stack<>();
public static boolean row(int[][] arr) { // 행 단위로 검사하는 함수
boolean flag = true;
outer : for(int i=0; i<9; i++) {
stk.clear();
for(int j=0; j<9; j++) {
stk.push(arr[i][j]); // 행 단위로 stack에 추가
}
for(int k=1; k<=9; k++) {
if(stk.contains(k)){ // 1~9까지 stk에 있는지 검사
flag = true; // 모두 통과하면 true
} else {
flag = false; // 하나라도 false면 false 후 break
break outer;
}
}
}
return flag;
}
public static boolean col(int[][] arr) { // 열 단위로 검사하는 함수
boolean flag = true;
outer : for(int i=0; i<9; i++) {
stk.clear();
for(int j=0; j<9; j++) {
stk.push(arr[j][i]); // 열 단위로 stack에 push
}
for(int k=1; k<=9; k++) {
if(stk.contains(k)){ // stack에 있는지 확인
flag = true; // 모두 통과하면 true
} else {
flag = false; // 하나라도 false면 false 후 break
break outer;
}
}
}
return flag;
}
public static boolean square(int[][] arr) { // 3x3 단위로 검사하는 함수
boolean flag = true;
outer : for(int i=0; i<7; i += 3) { // 0, 3, 6 위치 단위에 위치
stk.clear();
for(int j=0; j<7; j += 3) {
for(int k=0; k<3; k++) {
for(int x=0; x<3; x++) {
stk.push(arr[i+k][j+x]); // 0, 3, 6 위치에서 3x3 부분만 push
}
}
for(int n=1; n<=9; n++) {
if(stk.contains(n)) {
flag = true;
} else {
flag = false; // 하나라도 false면 false 후 break
break outer;
}
}
}
}
return flag;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int tc=1; tc<=T; tc++) {
int[][] arr = new int[9][9];
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++) {
arr[i][j] = sc.nextInt();
}
}
// ---------------------입력
if(row(arr) && col(arr) && square(arr)) { // 행, 열, 사각형 모두 true면 1 / 하나라도 false 면 0
System.out.println("#"+tc+" "+1);
}else {
System.out.println("#"+tc+" "+0);
}
}
}
}
[전체적인 아이디어]
- 행 단위 파악
- 열 단위 파악
- 3X3 배열 단위 파악
- 앞선 세 개를 모두 함수화하여 최종적으로 모두 true값이면 1, 하나라도 아니면 0 출력
[세부사항]
- 숫자 구성요소 파악 시 Stack 구조 사용
: 최근 스택을 처음 배워 손에 익히기 위함이 첫 번째 이유이고, 두 번째로는 .contain으로 쉽게 확인할 수 있다고 생각
- 함수화
: 이 전에는 알고리즘 기초가 부족해서 단순히 구현만을 목표로 문제 풀이를 시작했다면, 이제는 최대한 함수를 만들어 사용하면서 A 끝내고 B 끝내고 C 끝내는 단순히 구현하는 문제풀이보다는, 전체적인 문제풀이의 흐름을 구상하고, 흐름 속의 공통점을 찾아서 함수화할 수 있는 능력을 기르기 위해서.
: 사실 굳이 함수화를 하지 않아도 되는 문제이긴 하지만, 최대한 함수를 만들어보고 사용하며 손에 익히려고 노력
'Coding Test > JAVA' 카테고리의 다른 글
[BOJ 실버3 JAVA] 1966 프린터 큐 (0) | 2022.02.21 |
---|---|
[BOJ 실버4 JAVA] 1920 수 찾기 - 이진 탐색 (0) | 2022.02.15 |