문제 개요
이 문제에서는 크기가 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가 정확히 한 번씩 등장하는 행렬을 효율적으로 생성할 수 있습니다.