Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 코드로 패턴이 중심 대칭인지 판별하는 방법

3×3 크기의 행렬이 있고, 각 칸에는 'X' 또는 '.' 문자가 들어 있다고 가정해 봅시다. 이때 이 패턴이 중심 대칭(center symmetry)을 이루는지 아닌지를 확인하는 프로그램을 작성해야 합니다. 중심 대칭이란 행렬의 중앙 지점을 기준으로 180도 회전했을 때 원래 모양과 완전히 같은 형태가 되는 대칭 구조를 의미합니다.


예를 들어 입력이 다음과 같다면,

XX.
...
.XX

중앙을 기준으로 대각선 방향의 요소들이 서로 같으므로 출력 결과는 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]은 자기 자신과 대칭되므로 비교 대상에서 제외됩니다.