[JAVA] SWEA 1974 스도쿠 검증
2022. 7. 11.
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. 서론

 

종이도 생각도 필요 없을 만큼 쉽다...! 다만 배열 범위를 여기저기 넘나들어야 하기 때문에 그것만 주의하면 될 듯.(범위에 대해서)

 

2. 문제 풀이

 

9x9 배열이 주어진다. 이 배열에 적힌값들이 스도쿠의 규칙에 맞는지 점검해보는 문제이다.

스도쿠에는 한 줄에 1~9의 값이 모두 적혀 있어야 하고 중복이 있으면 안 된다. (가로, 세로, 9칸)

 

나는 그냥 간단하게 계수정렬을 이용했다. 가로로, 세로로, 9칸을 돌면서 그 값을 카운트해주고, 만약 스도쿠의 규칙에 맞다면 각 항목의 값이 전부 1이어야 하지만 그 이상인 값이 있는 경우는 중복, 즉 스도쿠의 규칙에 어긋나기 때문에 틀린 것이다.

이때 9칸씩 옮기는 범위를 설정하는 것은 요며칠 계속 풀었던 문제들에서 응용했다.

 

https://coding-log.tistory.com/155?category=954740 

 

[JAVA] SWEA 2001 파리 퇴치

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PzOCKAigDFAUq SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy..

coding-log.tistory.com

 
 
 
 
 
 
 

3. 코드 설명

 

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
		int t = s.nextInt();
		
		for (int k = 0; k < t; k++)
		{
			int[][] a = new int[9][9];
			for (int i = 0; i < 9; i++)
				for (int j = 0; j < 9; j++)
					a[i][j] = s.nextInt();
			
			int rslt = 1;
			for (int i = 0; i < 9; i++) {
				int[] tmp = new int[11];
				
				for (int j = 0; j < 9; j++)
					tmp[a[i][j]]++; 
				
				for (int j = 1; j <= 10; j++)
					if (tmp[j] > 1)
						rslt = 0;
			}
			
			for (int i = 0; i < 9; i++) {
				int[] tmp = new int[11];
				
				for (int j = 0; j < 9; j++)
					tmp[a[j][i]]++; 
				
				for (int j = 1; j <= 10; j++)
					if (tmp[j] > 1)
						rslt = 0;
			}
			
			int x = 0, y = 0, i = 0, j = 0;
			while(true) {
				int[] tmp = new int[11];
				for (i = x; i < 3 + x; i++)
					for (j = y; j < 3 + y; j++)
						tmp[a[i][j]]++;
				y = j;
				
				for (j = 1; j < 10; j++)
					if (tmp[j] > 1)
						rslt = 0;
				
				if (y >= 9)
					y = 0; x = i;
						
				if (x >= 7)
					break;
			}
			System.out.println("#" + (k + 1) + " " + rslt);				
		}
	}
}

 

값들을 입력 받고 가로, 세로, 9칸 순으로 체크해준다.

계수 정렬을 사용하기 위해 tmp 배열을 하나 만들어줘서 가로마다 세로마다 9칸마다의 값을 카운트해줬다.

그리고 rslt를 1로 선언해두고 스도쿠 규칙에 어긋나면 0이 되도록 했다.

 

0, 0

0, 3

0, 6

3, 0

...

 

이런 식으로 범위가 움직여야 하기 때문에 y값은 3씩, 그리고 x값은 y가 범위 끝에 다다르면 3씩 올라가게 코드를 짰다.

다른 사람들도 다 계수 정렬로 코드를 짰을까? 괜히 궁금 ㅎ

 

 

 

 

 

반응형
myoskin