๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[SW Expert Academy] - (D2)1974. ์Šค๋„์ฟ  ๊ฒ€์ฆ

by ์ฃผ๋ฐœ2 2020. 8. 10.
๋ฐ˜์‘ํ˜•

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com

 

์ฝ”๋“œ

import java.util.Scanner;

public class Solution {

	static int map[][];
	static boolean flag[];

	/* ํ–‰(๊ฐ€๋กœ) ์ฒดํฌ */
	public static boolean checkRow(int i) {
		flag = new boolean[9];

		for(int j=0; j<9; j++) {
			if(flag[map[i][j]-1]) {	// ํ˜„์žฌ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” flag[]๋ฐฐ์—ด์ด true์ธ๊ฒฝ์šฐ -> ์ค‘๋ณต๋œ ๊ฒฝ์šฐ.
				return false;
			}
			flag[map[i][j]-1] = true; // ํ•ด๋‹น ๊ฐ’์ด ์ฒ˜์Œ ์ฒดํฌ๋˜๋Š” ๊ฒฝ์šฐ(false) -> true๋กœ ์„ค์ •
		}
		return true;
	}

	/* ์—ด(์„ธ๋กœ) ์ฒดํฌ */
	public static boolean checkCol(int i) {
		flag = new boolean[9];

		for(int j=0; j<9; j++) {
			if(flag[map[j][i]-1]) {	// ํ˜„์žฌ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” flag[]๋ฐฐ์—ด์ด true์ธ๊ฒฝ์šฐ -> ์ค‘๋ณต๋œ ๊ฒฝ์šฐ.
				return false;
			}
			flag[map[j][i]-1] = true; // ํ•ด๋‹น ๊ฐ’์ด ์ฒ˜์Œ ์ฒดํฌ๋˜๋Š” ๊ฒฝ์šฐ(false) -> true๋กœ ์„ค์ •
		}
		return true;
	}

	/* 3x3 ๊ฒฉ์ž ์ฒดํฌ */
	public static boolean checkGrid(int x, int y) {
		flag = new boolean[9];
		int nx = x + 3;
		int ny = y + 3;

		for(int i=x; i<nx; i++) {
			for(int j=y; j<ny; j++) {
				if(flag[map[i][j]-1]) {
					return false;
				}
				flag[map[i][j]-1] = true;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int T = scan.nextInt();

		for(int tc=1; tc<=T; tc++) {
			map = new int[9][9];
			boolean flag = true;

			for(int i=0; i<9; i++) {
				for(int j=0; j<9; j++) {
					map[i][j] = scan.nextInt();
				}
			}

			/* ํ–‰ ์ฒดํฌ */
			for(int i=0; i<9; i++) {
				if(!checkRow(i)) {
					System.out.println("#" + tc + " " + 0);
					flag = false;
					break;
				}
			}

			if(!flag) continue;

			/* ์—ด ์ฒดํฌ */
			for(int i=0; i<9; i++) {
				if(!checkCol(i)) {
					System.out.println("#" + tc + " " + 0);
					flag = false;
					break;
				}
			}

			if(!flag) continue;

			/* 3x3 ๊ฒฉ์ž ์ฒดํฌ */
			Outter: for(int i=0; i<=6; i+=3) {
				for(int j=0; j<=6; j+=3) {
					if(!checkGrid(i, j)) {
						System.out.println("#" + tc + " " + 0);
						flag = false;
						break Outter;
					}
				}
			}
			
			// ์œ„ ๊ณผ์ •์—์„œ flag๊ฐ€ false์ธ ๊ฒฝ์šฐ -> ์ค‘๋ณต๋œ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ continue, ์•„๋‹๊ฒฝ์šฐ 1 ์ถœ๋ ฅ
			if(!flag) continue;
			System.out.println("#" + tc + " " + 1);
		}

		scan.close();
	}
}

 

ํ’€์ด

๋ฌธ์ œ์—์„œ ํ™•์ธํ•ด์•ผ ํ•  ๊ณณ์€ 3๊ฐ€์ง€์ด๋‹ค.

 

์œ„์™€ ๊ฐ™์ด 9X9 ๊ฒฉ์žํŒ์—์„œ ๊ฐ€๋กœ์™€ ์„ธ๋กœ, 3X3์˜ ๊ทธ๋ฆฌ๋“œ ๊ฒฉ์ž๋ฅผ ๋”ฐ์ ธ๋ด์•ผ ํ•œ๋‹ค.

 

๊ฐ๊ฐ ํŒ๋‹จํ• ๋•Œ boolean flag[] ๋ผ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด์„œ ์ฒดํฌ๋ฅผ ํ–ˆ๋‹ค.

 

1  2  3  4  5  6  7  8  9

 

๊ฐ€๋กœ๊ฐ€ ์œ„์™€๊ฐ™์ด ์žˆ์„๋•Œ, ๊ฐ ๊ฐ’์— -1(๋ฐฐ์—ด์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ)์— ํ•ด๋‹นํ•˜๋Š” flag[] ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ true์ธ ๊ฒฝ์šฐ์™€ false์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ ์„œ ํ’€์—ˆ๋‹ค.

 

๊ธฐ๋ณธ๊ฐ’์€ false์ด๋ฏ€๋กœ, ์ดˆ๊ธฐ์—๋Š” false์ด๊ณ  9๊ฐœ์”ฉ ์ˆซ์ž๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” flag ๋ฐฐ์—ด์˜ ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๊ณ , ๋งŒ์•ฝ ํ•ด๋‹น ๊ฐ’์ด ์ด๋ฏธ true์ธ ๊ฒฝ์šฐ๋Š” ์ค‘๋ณต๋œ ์ˆ˜์ด๋ฏ€๋กœ 0์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

 

์œ„ ๊ฐ€๋กœ, ์„ธ๋กœ๋ฅผ ์ฒดํฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

	/* ํ–‰(๊ฐ€๋กœ) ์ฒดํฌ */
	public static boolean checkRow(int i) {
		flag = new boolean[9];

		for(int j=0; j<9; j++) {
			if(flag[map[i][j]-1]) {	// ํ˜„์žฌ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” flag[]๋ฐฐ์—ด์ด true์ธ๊ฒฝ์šฐ -> ์ค‘๋ณต๋œ ๊ฒฝ์šฐ.
				return false;
			}
			flag[map[i][j]-1] = true; // ํ•ด๋‹น ๊ฐ’์ด ์ฒ˜์Œ ์ฒดํฌ๋˜๋Š” ๊ฒฝ์šฐ(false) -> true๋กœ ์„ค์ •
		}
		return true;
	}

	/* ์—ด(์„ธ๋กœ) ์ฒดํฌ */
	public static boolean checkCol(int i) {
		flag = new boolean[9];

		for(int j=0; j<9; j++) {
			if(flag[map[j][i]-1]) {	// ํ˜„์žฌ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” flag[]๋ฐฐ์—ด์ด true์ธ๊ฒฝ์šฐ -> ์ค‘๋ณต๋œ ๊ฒฝ์šฐ.
				return false;
			}
			flag[map[j][i]-1] = true; // ํ•ด๋‹น ๊ฐ’์ด ์ฒ˜์Œ ์ฒดํฌ๋˜๋Š” ๊ฒฝ์šฐ(false) -> true๋กœ ์„ค์ •
		}
		return true;
	}
    
    
                        // main ํ•จ์ˆ˜
    			/* ํ–‰ ์ฒดํฌ */
			for(int i=0; i<9; i++) {
				if(!checkRow(i)) {
					System.out.println("#" + tc + " " + 0);
					flag = false;
					break;
				}
			}

			if(!flag) continue;

			/* ์—ด ์ฒดํฌ */
			for(int i=0; i<9; i++) {
				if(!checkCol(i)) {
					System.out.println("#" + tc + " " + 0);
					flag = false;
					break;
				}
			}

			if(!flag) continue;

continue ๋ถ€๋ถ„์€, ์ด๋ฏธ ์ค‘๋ณต๋œ ์ˆ˜๋กœ ์ธํ•ด flag๊ฐ’์ด false๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋น ๋ฅด๊ฒŒ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ ์ž ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

 

์ƒ๊ฐ์„ ์ข€ ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ 3X3์˜ ๊ทธ๋ฆฌ๋“œ ๊ฒฉ์ž ๋ถ€๋ถ„์ด๋‹ค.

๋จผ์ € ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

	/* 3x3 ๊ฒฉ์ž ์ฒดํฌ */
	public static boolean checkGrid(int x, int y) {
		flag = new boolean[9];
		int nx = x + 3;
		int ny = y + 3;

		for(int i=x; i<nx; i++) {
			for(int j=y; j<ny; j++) {
				if(flag[map[i][j]-1]) {
					return false;
				}
				flag[map[i][j]-1] = true;
			}
		}
		return true;
	}
    
    
    			/* 3x3 ๊ฒฉ์ž ์ฒดํฌ */
			Outter: for(int i=0; i<=6; i+=3) {
				for(int j=0; j<=6; j+=3) {
					if(!checkGrid(i, j)) {
						System.out.println("#" + tc + " " + 0);
						flag = false;
						break Outter;
					}
				}
			}

3x3 ๊ทธ๋ฆฌ๋“œ๋Š” 3๊ฐœ์”ฉ ๋ฐ˜๋ณต๋˜๋Š”๋ฐ ์ขŒํ‘œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

(0,0) (0,1) (0,2)      (0,3) (0,4) (0,5) ...

(1,0) (1,1) (1,2)      (1,3) (1,4) (1,5) ...

 (2,0) (2,1) (2,2)      (2,3) (2,4) (2,5) ... 

 

3๊ฐœ์”ฉ ๋ฐ˜๋ณต์ด ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ checkGrid ํ•จ์ˆ˜์— nx = x+3 , ny = y+3 ์œผ๋กœ ์„ค์ •ํ•˜๊ณ ,

3๊ฐœ์”ฉ ๋ฐ˜๋ณตํ• ๊ฑฐ๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ์— ์ดˆ๊ธฐ๊ฐ’๊ณผ ๋๊ฐ’์„ ์„ค์ •ํ•ด์ค€๋‹ค(i=x; i<nx; , j=y; j<ny)

main ํ•จ์ˆ˜์—์„œ๋„ ๊ฐ’์„ 3์”ฉ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ  0, 3, 6 ์„ธ ๊ฐœ๋งŒ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๋ฏ€๋กœ 6๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์ค€๋‹ค.

 

 

Outter: ์ด ๋ถ€๋ถ„์€ Java์˜ Label ์ด๋‹ค.

break Outter: ๋ถ€๋ถ„์„ ํ†ตํ•ด ์œ„์—๊นŒ์ง€ ๋˜๋Œ์•„๊ฐ€๋Š”๋ฐ,

๋ผ๋ฒจ< ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€