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

 

SW Expert Academy

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

swexpertacademy.com

 

9x9 판이 주어지면 가로, 세로, 3x3 구간에 각 숫자들이 1 ~ 9까지 들어있는지 확인하는 문제다.

깡 구현 문제인데 가로, 세로는 쉽게 구현할 수 있고 3x3 사이즈도 조금만 생각해보면 쉽게 풀린다.

 

#include <bits/stdc++.h>
using namespace std;

int ar[9][9];
bool vis[9];

bool chk() { //가로
	int sum = 0;
	for (int i = 0; i < 9; ++i) {
		sum = 0;
		for (int j = 0; j < 9; ++j) {
			sum += ar[i][j];
		}
		if (sum != 45) return false;
	}
	return true;
}

bool chk2() { //세로
	int sum = 0;
	for (int i = 0; i < 9; ++i) {
		sum = 0;
		for (int j = 0; j < 9; ++j) {
			sum += ar[j][i];
		}
		if (sum != 45) return false;
	}
	return true;
}

bool chk3(int x, int y) { //3x3
	fill(vis, vis + 9, false);
	for (int i = x; i < x + 3; ++i) {
		for (int j = y; j < y + 3; ++j) {
			if (vis[ar[i][j] - 1]) return false;
			vis[ar[i][j] - 1] = true;
		}
	}
	return true;
}

int main() {
	//ios::sync_with_stdio(false); cin.tie(0);

	int TC;
	cin >> TC;
	
	for (int tc = 1; tc <= TC; ++tc) {
		for (int i = 0; i < 9; ++i) {
			for (int j = 0; j < 9; ++j) {
				cin >> ar[i][j];
			}
		}

		bool end = false;
		if (!chk()) {
			cout << '#' << tc << ' ' << 0 << '\n'; continue;
		}
		if (!chk2()) {
			cout << '#' << tc << ' ' << 0 << '\n'; continue;
		}
		for (int i = 0; i <= 6; i += 3) {
			for (int j = 0; j <= 6; j += 3) {
				if (!chk3(i, j)) {
					end = true; break;
				}
			}
			if (end) break;
		}
		if (end) {
			cout << '#' << tc << ' ' << 0 << '\n'; continue;
		}
		cout << '#' << tc << ' ' << 1 << '\n';

	}

	return 0;
}

 

가로와 세로 부분은 각 줄의 합이 45가 아니라면 잘못된 스도쿠니까 0을 출력시켜주고 chk3 함수에서 3x3은

각 숫자들이 방문했는지 vis 배열을 통해서 처리해줬다.

'SWEA' 카테고리의 다른 글

SWEA 숫자 배열 회전  (0) 2020.10.30
SWEA 1859 백만 장자 프로젝트  (0) 2020.10.28

+ Recent posts