문제
사토르 마방진에 대해 들어본 적이 있는가? 사토르 마방진은 간단히 말하면 "가로로 읽었을 때와 세로로 읽었을 때 똑같이 읽히는 단어 집합"이다. 예시로는 다음과 같은 것들이 있다.
라팔아
팔렸니
아니오
호반우
반기는
우는나
술을 좋아하는 드립이는 전날 과음한 나머지 수학 수업 시간에 졸다가 선생님에게 걸려버렸고, 단어 집합들이 사토르 마방진인지 아닌지 판단해야 하는 숙제를 받았다.
하지만 N × N 크기의 큰 단어 집합이 사토르 마방진인지 눈으로 확인하는 것은 쉽지 않았다.
불쌍한 드립이는 숙제를 다 끝내기 전까지 집에 갈 수 없다. N × N 크기의 단어 집합이 주어지면, 주어진 단어 집합이 사토르 마방진인지 아닌지 판단하는 프로그램을 작성하자.
드립이를 도와주자!
입력
첫째 줄에 단어의 길이 N이 주어진다. (2 ≤ N ≤ 100)
둘째 줄부터 N개의 줄에 걸쳐 단어 집합의 각 행의 단어들이 공백 없이 주어진다. 단어들은 알파벳 대문자로만 이루어져 있다.
출력
주어진 단어 집합이 사토르 마방진이면 "YES", 아니면 "NO"를 출력한다. (따옴표 제외)
풀이 과정
문자열을 위에서 아래로, 왼쪽에서 오른쪽으로 읽었을 때가 동일한지 비교해야 한다.
0번째 가로 줄과 0번째 세로 줄, 1번째 가로 줄과 1번째 세로 줄 .... n - 1번째 가로 줄과 n - 1번째 세로 줄이 동일한 문장인지 확인하여 결과에 따라 YES와 NO를 출력한다.
C
#include <stdio.h>
char str[105][105];
int main(void) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%s", str[i]);
int done = 1;
for (int idx = 0; idx < n; idx++) {
for (int c = 0; c < n; c++) {
if (str[idx][c] != str[c][idx]) {
done = 0;
break;
}
}
if (done == 0) break;
}
if (done == 1) printf("YES");
else printf("NO");
return 0;
}
Python
import sys
input = sys.stdin.readline
n = int(input().rstrip())
maps = [list(input().rstrip()) for _ in range(n)]
maps_reverse = []
for j in range(n):
now = ""
for i in range(n):
now += maps[i][j]
maps_reverse.append(list(now))
done = 1
for i in range(n):
if maps[i] != maps_reverse[i]:
done = 0
break
print('YES' if done == 1 else 'NO')
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 10798 : 세로읽기 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |
---|---|
[ BOJ ] 2711 : 오타맨 고창영 ( BRONZE 2 ) / C, Python (0) | 2023.11.14 |
[ BOJ ] 1996 : 지뢰 찾기 ( SILVER 5 ) / C, Python (0) | 2023.11.13 |
[ BOJ ] 2669 : 직사각형 네개의 합집합의 면적 구하기 ( SILVER 5 ) / C, Python (0) | 2023.11.12 |
[ BOJ ] 4458 : 첫 글자를 대문자로 ( BRONZE 3 ) / C, Python (0) | 2023.11.12 |