문제 분류 수업 진도 대회 채점현황 순위 질문게시판
게임
스도쿠 타이핑 리듬 타자게임 타이핑 테트리스 타이핑 인베이더 타이핑 지뢰찾기 8192 공룡게임 타이핑 플래피버드 랭킹
로그인

7039 : 마방진 검사

•시간제한: 1.000 S •메모리제한: 256 MB •제출: 0 •통과: 0 •만든사람: suakii

7039 : 마방진 검사

시간 1.000s · 메모리 256MB · 제출 0 · 정답 0

문제 설명

마방진(Magic Square)이란 $N \times N$ 크기의 격자판에 $1$부터 $N^2$까지의 자연수를 중복 없이 한 번씩만 배치하여, 가로, 세로, 그리고 두 대각선의 원소들의 합이 모두 같아지도록 만든 행렬을 말합니다.
이때 각 라인의 합은 항상 $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$개의 정수가 공백으로 구분되어 행렬의 원소로 주어집니다.

출력 설명

올바른 마방진이면 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$ 두 대각선 합 순으로 올바른지 하나씩 수동으로 비교 검사합니다.

출처/분류

NOTICE  —  BFStudy OJ 정보샘
애들아, 문제 많이 풀고 게임 잠깐 하는거지?
— 정보샘