3×3 크기의 행렬이 있고, 각 칸에는 'X' 또는 '.' 문자가 들어 있다고 가정해 봅시다. 이때 이 패턴이 중심 대칭(center symmetry)을 이루는지 아닌지를 확인하는 프로그램을 작성해야 합니다. 중심 대칭이란 행렬의 중앙 지점을 기준으로 180도 회전했을 때 원래 모양과 완전히 같은 형태가 되는 대칭 구조를 의미합니다.
예를 들어 입력이 다음과 같다면,
| X | X | . |
| . | . | . |
| . | X | X |
중앙을 기준으로 대각선 방향의 요소들이 서로 같으므로 출력 결과는 True가 됩니다.
풀이 접근 방법
3×3 행렬에서 중심 대칭 여부는 중앙 칸(1, 1)을 기준으로 마주 보는 위치의 값들을 비교하면 됩니다. 즉, 다음 네 쌍의 요소만 일치하면 전체 패턴이 중심 대칭입니다.
- M[0][0] ↔ M[2][2] (좌상단 ↔ 우하단)
- M[0][1] ↔ M[2][1] (상단 중앙 ↔ 하단 중앙)
- M[0][2] ↔ M[2][0] (우상단 ↔ 좌하단)
- M[1][0] ↔ M[1][2] (좌측 중앙 ↔ 우측 중앙)
이를 의사 코드로 표현하면 다음과 같습니다.
M[0][0] == M[2][2] && M[0][1] == M[2][1] &&
M[0][2] == M[2][0] && M[1][0] == M[1][2]
이라면:
true 반환
그렇지 않으면:
false 반환C++ 구현 예제
아래는 위 로직을 실제 C++ 코드로 구현한 예제입니다.
#include <bits/stdc++.h>
using namespace std;
bool solve(vector<vector<char>> M){
if (M[0][0] == M[2][2] && M[0][1] == M[2][1] && M[0][2] == M[2][0] && M[1][0] == M[1][2])
return true;
else
return false;
}
int main(){
vector<vector<char>> matrix = { { 'X', 'X', '.' }, { '.', '.', '.' }, { '.', 'X', 'X' } };
cout << solve(matrix) << endl;
}입력
{ { 'X', 'X', '.' }, { '.', '.', '.' }, { '.', 'X', 'X' } }출력
1
출력값 1은 true를 의미하며, 주어진 행렬이 중심 대칭임을 나타냅니다. 이 알고리즘은 고정된 개수의 비교 연산만 수행하므로 시간 복잡도는 O(1)로 매우 효율적입니다. 참고로 중앙 칸 M[1][1]은 자기 자신과 대칭되므로 비교 대상에서 제외됩니다.