※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 15739번 문제인 매직스퀘어이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/15739
15739번: 매직스퀘어
수학에서 행렬(行列, matrix)은 수나 기호, 수식 등을 네모꼴로 배열한 것으로, 가로줄을 행(row), 세로줄을 열(column)이라고 한다. 특히 행과 열의 개수가 같은 행렬을 정방행렬(square matrix)이라고 한
www.acmicpc.net
주어진 마방진이 (1) 1 이상 N^2 이하의 서로 다른 수로 이루어져 있고 (2) 각 행의 숫자의 합과 각 열의 숫자의 합, 그리고 두 대각선의 각 숫자의 합이 모두 같은 값인지 이 두 가지를 확인하는 문제이다.
문제에도 주어져있지만, 1부터 N^2까지의 수로 이루어진 마방진의 한 행의 숫자들의 합은 (1~N^2의 총합)/N과 같아야 할 수밖에 없다는 점을 이용하면 더욱 편하게 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int arr[100][100];
bool visited[10001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
bool ans = 1;
int N; cin >> N;
int NN = N * N;
int linesum = (NN * (NN + 1)) / (2 * N);
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
int& x = arr[r][c];
cin >> x;
if (visited[x]) ans = 0;
visited[x] = 1;
}
}
for (int r = 0; r < N; r++) {
int rsum = 0;
for (int c = 0; c < N; c++) {
rsum += arr[r][c];
}
if (rsum != linesum) ans = 0;
}
for (int c = 0; c < N; c++) {
int csum = 0;
for (int r = 0; r < N; r++) {
csum += arr[r][c];
}
if (csum != linesum) ans = 0;
}
int diag1 = 0, diag2 = 0;
for (int i = 0; i < N; i++) {
diag1 += arr[i][i], diag2 += arr[i][N - i - 1];
}
if (diag1 != linesum || diag2 != linesum) ans = 0;
if (ans) cout << "TRUE";
else cout << "FALSE";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15735 // C++] 삼각 (0) | 2022.06.26 |
---|---|
[BOJ 15736 // C++] 청기 백기 (0) | 2022.06.25 |
[BOJ 15734 // C++] 명장 남정훈 (0) | 2022.06.23 |
[BOJ 15733 // C++] 나는 누구인가 (0) | 2022.06.22 |
[BOJ 24928 // C++] Magical Runes (0) | 2022.06.21 |