์ฝ๋
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: ๋ถ๋ถ์ ํตํด ์์๊น์ง ๋๋์๊ฐ๋๋ฐ,
๋ผ๋ฒจ< ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค[Java] - ์ผ๊ฐ ๋ฌํฝ์ด (0) | 2020.09.26 |
---|---|
[Programmers] - ๋ ๊ฐ ๋ฝ์์ ๋ํ๊ธฐ (0) | 2020.09.20 |
[SW Expert Academy] - (D1)1933. ๊ฐ๋จํ N์ ์ฝ์(Stream) (0) | 2020.08.09 |
[SW Expert Academy] - (D1)2019. ๋๋ธ๋๋ธ(Stream) (0) | 2020.08.08 |
[SW Expert Academy] - (D1)2071. ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ(Stream) (0) | 2020.08.06 |
๋๊ธ