본문 바로가기

Algorithm

[SWEA] JAVA - 1974. 스도쿠 검증

9*9 표에 가로방향, 세로방향, 각 영역별로 1부터 9까지 채워져있는지를 체크하는 문제입니다.

스도쿠 게임을 할 때 가로방향 합, 세로방향 합, 내부 영역의 합이 모두 45일때가 올바른 스도쿠 입니다.

 

1. 각 영역의 왼쪽상단 y좌표, x좌표를 받아 가로방향과 세로방향 내부 영역의 합이 모두 45인지를 체크하는 함수를 만들었습니다.

2. 위의 3가지 경우를 모두 만족했을때 true를 리턴합니다. 그렇지 않다면 false를 리턴합니다.

3. main 함수에서 이중 포문을 돌며 y좌표,x좌표를 3씩 증가시킵니다. 이때의 좌표값이 각 영역의 시작 좌표이므로 solve 함수의 파라미터로 넣어 확인합니다.

 

package com.ssafy.makeupclass;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class SWEA_1974_스도쿠검증 {

	static int[][] map;
	
	private static boolean solve(int y, int x) {
		int sum=0;
		boolean row=false,col=false,area=false;
		//1. 가로
		for (int i = 0; i < 9; i++) {
			sum += map[y][i];
		}
		if(sum == 45) row = true;
		//2. 세로
		sum=0;
		for (int i = 0; i < 9; i++) {
			sum += map[i][y];
		}
		if(sum == 45) col = true;
		//3. 3*3 영역
		sum = 0;
		for (int i = y; i < y+3; i++) {
			for (int j = x; j < x+3; j++) {
				sum += map[i][j];
			}
		}
		if(sum == 45) area = true;
		
		return (row && col && area);
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		for (int t = 1; t <= TC; t++) {
			map = new int[9][9];
			
			for (int i = 0; i < 9; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine(), " ");
				for (int j = 0; j < 9; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			//solve
			int answer = 1;
			for (int i = 0; i < 9; i+=3) {
				for (int j = 0; j < 9; j+=3) {
					if(!solve(i,j)) {
						answer = 0;
					}
				}
			}
			sb.append("#").append(t).append(" ").append(answer).append("\n");
		}
		System.out.print(sb);
	}

}