7039 : 마방진 검사
•시간제한: 1.000 S
•메모리제한: 256 MB
•제출: 0
•통과: 0
•만든사람: suakii
문제 설명
마방진(Magic Square)이란 $N \times N$ 크기의 격자판에 $1$부터 $N^2$까지의 자연수를 중복 없이 한 번씩만 배치하여, 가로, 세로, 그리고 두 대각선의 원소들의 합이 모두 같아지도록 만든 행렬을 말합니다.
이때 각 라인의 합은 항상 $N(N^2 + 1)/2$로 일정해야 합니다.
2차원 정수 행렬이 주어졌을 때, 이 행렬이 올바른 마방진인지 검사하는 프로그램을 작성하십시오.
만약 올바른 마방진이 아니라면, 아래의 우선순위 규칙에 따라 첫 번째 실패 원인을 출력해야 합니다.
[실패 원인 판정 규칙 및 우선순위]
1. 중복 및 범위 오류: 행렬에 $1$부터 $N^2$ 범위 밖의 수가 존재하거나, 중복된 수가 있는 경우
2. 행 오류: 각 행의 합이 올바른 합과 다르면, 가장 번호가 빠른 행($0$-based 인덱스
3. 열 오류: 각 열의 합이 올바른 합과 다르면, 가장 번호가 빠른 열($0$-based 인덱스
4. 대각선 오류: 주 대각선 또는 반 대각선의 합이 올바른 합과 다르면
[제약 조건]
• 행렬 크기 $N$: $2 \le N \le 10$
이때 각 라인의 합은 항상 $N(N^2 + 1)/2$로 일정해야 합니다.
2차원 정수 행렬이 주어졌을 때, 이 행렬이 올바른 마방진인지 검사하는 프로그램을 작성하십시오.
만약 올바른 마방진이 아니라면, 아래의 우선순위 규칙에 따라 첫 번째 실패 원인을 출력해야 합니다.
[실패 원인 판정 규칙 및 우선순위]
1. 중복 및 범위 오류: 행렬에 $1$부터 $N^2$ 범위 밖의 수가 존재하거나, 중복된 수가 있는 경우
"duplicate" 출력.2. 행 오류: 각 행의 합이 올바른 합과 다르면, 가장 번호가 빠른 행($0$-based 인덱스
i)에 대해 "row i" 출력. (예: $1$번째 행이 다르면 "row 0")3. 열 오류: 각 열의 합이 올바른 합과 다르면, 가장 번호가 빠른 열($0$-based 인덱스
j)에 대해 "col j" 출력. (예: $1$번째 열이 다르면 "col 0")4. 대각선 오류: 주 대각선 또는 반 대각선의 합이 올바른 합과 다르면
"diag" 출력.[제약 조건]
• 행렬 크기 $N$: $2 \le N \le 10$
입력 설명
첫째 줄에 행렬의 크기 $N$이 주어집니다. ($2 \le N \le 10$)
둘째 줄부터 $N$개의 줄에 걸쳐 각 줄에 $N$개의 정수가 공백으로 구분되어 행렬의 원소로 주어집니다.
둘째 줄부터 $N$개의 줄에 걸쳐 각 줄에 $N$개의 정수가 공백으로 구분되어 행렬의 원소로 주어집니다.
출력 설명
올바른 마방진이면
YES를 출력하고, 마방진이 아니라면 판정 규칙의 우선순위에 따라 실패한 첫 원인(duplicate, row i, col j, diag)을 출력합니다.
입력 예시
COPY
복사되었습니다!
복사되었습니다!
3
8 1 6
3 5 7
4 9 2
출력 예시
COPY
복사되었습니다!
복사되었습니다!
YES
도움
먼저
seen 해시셋을 만들어 1부터 $N^2$까지의 숫자가 정확히 1번씩만 등장했는지 검사합니다. 통과 시 마방진 상수 $MagicSum = N(N^2 + 1)/2$를 계산한 뒤, 가로 행 합 $\to$ 세로 열 합 $\to$ 두 대각선 합 순으로 올바른지 하나씩 수동으로 비교 검사합니다.