스프레드시트의 열 제목은 알파벳 문자로 구성됩니다. 첫 번째 열은 A로 시작하고, Z 다음에는 AA, AB가 이어지며, ZZ 이후에는 다시 AAA, AAB 순으로 진행됩니다. 즉, 1번 열은 A, 26번 열은 Z, 27번 열은 AA에 해당합니다.
이 글에서는 열 번호가 주어졌을 때 이에 대응하는 열 제목(문자)을 구하는 방법을 C++ 코드로 살펴보겠습니다. 예를 들어 열 번호가 80이면 결과는 CB이고, 30이면 AD가 됩니다.
변환 원리
이 문제는 일반적인 26진법 변환과 비슷하지만 한 가지 중요한 차이가 있습니다. 스프레드시트 열 제목에는 0에 해당하는 자릿수가 없다는 점입니다. 각 자릿수의 범위가 1~26(A~Z)이므로, 나눗셈 과정에서 나머지가 0이 되면 'Z'로 처리하고 몫에서 1을 빼주는 보정 작업이 필요합니다.
- n을 26으로 나눈 나머지(rem)를 구합니다.
- rem이 0이면 문자열에 'Z'를 추가하고, n을 n/26 − 1로 갱신합니다.
- rem이 0이 아니면 (rem − 1) + 'A'에 해당하는 문자를 추가하고, n을 n/26으로 갱신합니다.
- n이 0이 될 때까지 반복한 뒤, 누적된 문자열을 뒤집으면 최종 열 제목이 완성됩니다.
C++ 구현 예제
#include<iostream>
#include<algorithm>
using namespace std;
void showColumnLetters(int n) {
string str = "";
while (n) {
int rem = n % 26;
if (rem == 0) {
str += 'Z';
n = (n / 26) - 1;
} else {
str += (rem - 1) + 'A';
n = n / 26;
}
}
reverse(str.begin(), str.begin() + str.length());
cout << str << endl;
}
int main() {
int n = 700;
cout << "Cell name of " << n << " is: ";
showColumnLetters(n);
}입력
700
출력
Cell name of 700 is: ZX
동작 과정 분석
입력값 700이 ZX로 변환되는 과정은 다음과 같습니다.
- 700 ÷ 26 → 몫 26, 나머지 24 → 'X' 추가, n = 26
- 26 ÷ 26 → 나머지 0 → 'Z' 추가, n = 26/26 − 1 = 0
- 역순으로 누적된 "XZ"를 뒤집으면 최종 결과 "ZX"가 됩니다.
이 알고리즘은 반복할 때마다 n이 약 1/26로 줄어들므로, 시간 복잡도는 O(log₂₆ n)입니다. 공간 복잡도 역시 결과 문자열 길이에 비례하여 O(log₂₆ n)입니다.