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

C++로 2D 행렬에 동심 직사각형 패턴 출력하기

이 문제에서는 2D 행렬에 여러 개의 직사각형이 서로 동심(同心)을 이루도록 패턴을 출력해야 합니다.

먼저 예시를 통해 문제를 자세히 이해해 보겠습니다.

n=4일 때 :
    4 4 4 4 4 4 4
    4 3 3 3 3 3 4
    4 3 2 2 2 3 4
    4 3 2 1 2 3 4
    4 3 2 2 2 3 4
    4 3 3 3 3 3 4
    4 4 4 4 4 4 4

위 예시처럼 정수 값 n을 입력받으면, 가장 바깥쪽부터 안쪽으로 갈수록 값이 1씩 줄어드는 동심 직사각형 패턴을 출력해야 합니다. 일반화된 형태는 다음과 같습니다.

n     n     n     n     n
n   n-1   n-1   n-1   n
n   n-1   n-2   n-1   n
n   n-1   n-1   n-1   n
n     n     n     n     n

문제 접근 방법

패턴을 잘 살펴보면 2D 행렬의 전체 크기는 (2n-1)개의 행과 열로 이루어져 있음을 알 수 있습니다. 이 행렬은 두 부분으로 나누어 출력할 수 있습니다.

  • 윗부분: 0번째 행부터 (2n-1)/2번째 행까지
  • 아랫부분: ((2n-1)/2 + 1)번째 행부터 2n-2번째 행까지

각 행에서는 값이 해당 행 번호 i에 도달할 때까지(n-i까지) 1씩 감소한 후, 중앙 지점을 기준으로 다시 n까지 1씩 증가하는 대칭 구조를 가집니다. 즉, 왼쪽 절반은 감소하고 오른쪽 절반은 증가하는 형태로 각 행을 구성하면 됩니다.

구현 예제

이 로직을 바탕으로 문제를 해결하는 C++ 프로그램을 작성해 보겠습니다.

#include <bits/stdc++.h>
using namespace std;
void print2Dsequence(int n){
    int s = 2 * n - 1;
    // 윗부분 출력 (0 ~ s/2)
    for (int i = 0; i < (s / 2) + 1; i++) {
        int m = n;
        for (int j = 0; j < i; j++) {
            cout << m << " ";
            m--;
        }
        for (int k = 0; k < s - 2 * i; k++) {
            cout << n - i << " ";
        }
        m = n - i + 1;
        for (int l = 0; l < i; l++) {
            cout << m << " ";
            m++;
        }
        cout << endl;
    }
    // 아랫부분 출력 (s/2 - 1 ~ 0)
    for (int i = s / 2 - 1; i >= 0; i--) {
        int m = n;
        for (int j = 0; j < i; j++) {
            cout << m << " ";
            m--;
        }
        for (int k = 0; k < s - 2 * i; k++) {
            cout << n - i << " ";
        }
        m = n - i + 1;
        for (int l = 0; l < i; l++) {
            cout << m << " ";
            m++;
        }
        cout << endl;
    }
}
int main(){
    int n = 4;
    cout<<"4의 동심 직사각형 시퀀스 : \n";
    print2Dsequence(n);
    return 0;
}

실행 결과

n=4일 때 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4

코드 설명

프로그램의 핵심 로직은 다음과 같이 세 단계로 구성됩니다.

  1. 왼쪽 감소 구간: 행 번호 i만큼 n부터 시작해 1씩 감소하는 값을 출력합니다.
  2. 중앙 고정 구간: (s - 2*i)개만큼 동일한 값(n-i)을 반복 출력합니다. 이 부분이 직사각형의 껍질을 만듭니다.
  3. 오른쪽 증가 구간: 왼쪽과 대칭되도록 값을 1씩 증가시키며 출력합니다.

윗부분은 i가 0부터 s/2까지 증가하며 출력하고, 아랫부분은 i를 역순으로 순회하여 대칭 구조를 완성합니다. 이 방식의 시간 복잡도는 O(n²)이며, 추가 메모리 없이 콘솔에 바로 출력하므로 공간 복잡도는 O(1)입니다.