Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

OD

[SWEA D2 JAVA] 1974 스도쿠 검증 본문

Coding Test/JAVA

[SWEA D2 JAVA] 1974 스도쿠 검증

ODlll 2022. 2. 18. 00:57

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