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

C++로 각 행과 열에 모든 모음이 포함된 N×M 행렬 출력하기

문제 개요

이 문제에서는 크기가 n×m인 2차원 행렬을 생성해야 합니다. 단, 행렬에는 오직 모음만 배치하며, 각 행과 각 열마다 모든 모음(a, e, i, o, u)이 반드시 포함되어야 합니다.

'모든 모음'이란 a, e, i, o, u 다섯 글자가 행렬의 모든 행과 모든 열에 존재해야 한다는 의미입니다. 따라서 필요한 최소 행·열 개수는 5개이며, 만들 수 있는 가장 작은 행렬의 크기는 5×5입니다.

예제를 통해 문제를 더 자세히 살펴보겠습니다.

예제 1

입력 : N = 5, M = 5
출력 :
   a e i o u
   e i o u a
   i o u a e
   o u a e i
   u a e i o

설명 − 모음 'a e i o u' 순서가 모든 행과 열에 규칙적으로 배열되어 있습니다. 첫 번째 행은 aeiou, 두 번째 행은 e로 시작하는 eioua, 세 번째 행은 i로 시작하는 iouae 형태로 왼쪽으로 한 칸씩 회전하며 배치됩니다.

예제 2

입력 : N = 3, M = 4
출력 : 행렬을 생성할 수 없습니다.

설명 − N과 M의 최솟값은 5이므로, 그보다 작은 값이 입력되면 행렬을 만들 수 없습니다.

해결 접근 방법

이 문제를 해결하기 위해서는 먼저 입력값이 최소 크기 조건(5)을 충족하는지 확인해야 합니다. N 또는 M이 5보다 작으면 "행렬을 생성할 수 없습니다"라는 메시지를 출력하고 종료합니다.

조건을 충족하는 경우에는 문자열 'aeiou'를 반복해서 출력하면 됩니다. 핵심은 각 행마다 시작 위치를 한 칸씩 왼쪽으로 회전시키는 것입니다. 즉, 첫 행은 'aeiou', 다음 행은 'eioua', 그다음은 'iouae'처럼 순환하며 출력합니다. 이는 인덱스 계산 시 (j + i) % 5를 활용하면 간단하게 구현할 수 있습니다.

C++ 구현 코드

#include <iostream>
using namespace std;

void vowelMatrix(int n, int m) {
   // 최소 크기 조건 확인
   if (n < 5 || m < 5) {
      cout << "Matrix cannot be created!";
      return;
   }
   string s = "aeiou";
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
         // 행마다 시작 인덱스를 회전시켜 모음 배치
         cout << s[(j + i) % 5] << " ";
      }
      cout << endl;
   }
}

int main() {
   int n = 5, m = 5;
   vowelMatrix(n, m);
   return 0;
}

실행 결과

a e i o u
e i o u a
i o u a e
o u a e i
u a e i o

동작 원리 정리

위 코드의 핵심은 s[(j + i) % 5]라는 인덱스 계산식입니다. 열 인덱스 j와 행 인덱스 i를 더한 뒤 5로 나눈 나머지를 사용하면, 각 행이 이전 행 대비 한 칸씩 왼쪽으로 회전된 형태가 됩니다. 덕분에 별도의 회전 연산 없이도 모든 행과 열에 a, e, i, o, u가 정확히 한 번씩 등장하는 행렬을 효율적으로 생성할 수 있습니다.