※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts