개요
이 글에서는 C++를 사용해 문장을 해당하는 모바일 숫자 키패드 시퀀스로 변환하는 프로그램을 살펴봅니다.
알파벳으로 이루어진 문자열이 주어졌을 때, 그 문자열을 실제로 입력하려면 어떤 숫자 키를 몇 번씩 눌러야 하는지를 나타내는 숫자 시퀀스를 출력하는 것이 목표입니다. 예전 버튼식 휴대폰에서 문자 메시지를 작성하던 방식과 동일한 원리입니다.
키패드 매핑 규칙
기존 휴대폰의 숫자 키패드에는 다음과 같이 알파벳이 배정되어 있습니다.
- 2 → A, B, C
- 3 → D, E, F
- 4 → G, H, I
- 5 → J, K, L
- 6 → M, N, O
- 7 → P, Q, R, S
- 8 → T, U, V
- 9 → W, X, Y, Z
- 0 → 공백(space)
접근 방법
가장 효율적인 방법은 각 알파벳에 대응하는 숫자 시퀀스를 미리 배열에 저장해 두는 것입니다. 그런 다음 입력 문자열을 한 글자씩 순회하면서, 공백이면 "0"을 추가하고 알파벳이면 배열에서 해당 시퀀스를 찾아 결과 문자열에 이어 붙이면 됩니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
// 숫자 시퀀스를 계산하는 함수
string calc_sequence(string arr[], string input) {
string output = "";
// 입력 문자열의 길이
int n = input.length();
for (int i = 0; i < n; i++) {
// 공백인 경우 0 추가
if (input[i] == ' ')
output = output + "0";
else {
// 'A'를 기준으로 배열 인덱스 계산
int position = input[i] - 'A';
output = output + arr[position];
}
}
return output;
}
int main() {
// 알파벳별 숫자 시퀀스를 배열에 저장
string str[] = {
"2", "22", "222",
"3", "33", "333",
"4", "44", "444",
"5", "55", "555",
"6", "66", "666",
"7", "77", "777", "7777",
"8", "88", "888",
"9", "99", "999", "9999"
};
string input = "TUTORIALSPOINT";
cout << calc_sequence(str, input);
return 0;
}
출력 결과
8888666777444255577777666444668
코드 동작 원리
- calc_sequence 함수는 입력 문자열의 길이만큼 반복하면서 각 문자를 하나씩 검사합니다.
- 현재 문자가 공백이면 결과 문자열에 "0"을 추가합니다.
- 알파벳인 경우 현재 문자에서 'A'의 아스키 코드 값을 빼면 0부터 시작하는 인덱스가 계산됩니다. 예를 들어 'C'는 'C' - 'A' = 2이므로 배열의 세 번째 요소인 "222"가 선택됩니다.
- 선택된 숫자 시퀀스를 결과 문자열에 계속 이어 붙인 후 최종 결과를 반환합니다.
위 예제에서 입력이 "TUTORIALSPOINT"이므로 T(8), U(88), T(8), O(666), R(777)... 순서로 변환되어 최종 출력이 완성됩니다.
시간 복잡도
입력 문자열의 길이를 n이라고 할 때, 각 문자를 한 번씩만 처리하므로 이 알고리즘의 시간 복잡도는 O(n)입니다. 공간 복잡도 역시 결과 문자열을 저장하기 위해 O(n)이 필요합니다.