본문 바로가기

백준

백준15739 - 매직스퀘어

https://www.acmicpc.net/problem/15739

 

15739번: 매직스퀘어

수학에서 행렬(行列, matrix)은 수나 기호, 수식 등을 네모꼴로 배열한 것으로, 가로줄을 행(row), 세로줄을 열(column)이라고 한다. 특히 행과 열의 개수가 같은 행렬을 정방행렬(square matrix)이라고 한다. 매직스퀘어(magic square,마방진,魔方陣)는 다음 2 가지 성질을 만족하는 정방행렬이다. 행렬의 원소는 1부터 `n*n`(n의 제곱) 범위의 정수로 구성하며, 중복되는 수가 없이 모두 달라야 한다. 행의 합, 열의 합,

www.acmicpc.net

마방진을 푸는 문제다. 우리가 생각하는 마방진을 구현하면 된다. 가로, 세로, 대각선의 합이 같아야하고 각 숫자가 무조건 한 개씩 배치되어야 하는 문제다.

 

#include <iostream>
#include <set>
using namespace std;

int check;
int n;
int mat[101][101];
set<int> st;

//가로행의 결과를 얻을 함수, mat[1][1] + mat[1][2] + mat[1][3] 순으로 가로의 결과 값을 더한다
bool checkwidth() {
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			ans = ans + mat[i][j];
		}
		if (check != ans) {
			return false;
		}
		ans = 0;
	}
	return true;
}

//세로행의 결과를 얻을 함수, mat[1][1] + mat[2][1] + mat[3][1] 순으로 결과 값을 더한다
bool checkheight() {
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			ans = ans + mat[j][i];
		}
		if (check != ans) {
			return false;
		}
		ans = 0;
	}
	return true;
}

//대각선의 결과를 얻을 함수
bool checkdiagonal() {
	int ans1 = 0;
	int ans2 = 0;

	//mat[1][1] + mat[2][2] + mat[3][3]순으로 결과 값을 더한다
	for (int i = 1; i <= n; i++) {
		ans1 = ans1 + mat[i][i];
	}

	//mat[1][3] + mat[2][2] + mat[3][1]순으로 결과 값을 더한다.
	for (int i = 1; i <= n; i++) {
		ans2 = ans2 + mat[i][n - i + 1];
	}

	//양쪽 결과 값이 마방진 결과와 같다면 true, 다르면 false
	if (check == ans1 && check == ans2) {
		return true;
	}
	else {
		return false;
	}
}

//숫자들을 각각 한 개씩 set에 넣을 함수
void inputcheck(int num) {
	st.insert(num);
}

//숫자들이 한 개씩 set에 들어갔는지 체크하는 함수
bool checksize() {
	return st.size() == n * n;
}

int main() {
	cin >> n;

	check = n * (n * n + 1) / 2; //마방진의 결과 값

	//마방진 입력
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> mat[i][j];
			inputcheck(mat[i][j]);
		}
	}

	//모든 조건에 맞다면 True, 하나라도 틀렸다면 False
	if (checksize() && checkheight() && checkwidth() && checkdiagonal()) {
		cout << "TRUE";
	}
	else {
		cout << "FALSE";
	}
}

'백준' 카테고리의 다른 글

백준1699 - 제곱수의 합  (0) 2019.07.28
백준2606 - 바이러스  (0) 2019.07.28
백준1773 - 폭죽쇼  (0) 2019.07.26
백준4673 - 셀프 넘버  (0) 2019.07.25
백준17070 - 파이프 옮기기1  (0) 2019.07.24