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 |