문제 소개
양의 정수가 하나 주어졌을 때, 이 숫자에 해당하는 스프레드시트(엑셀)의 열 제목을 찾아야 합니다. 스프레드시트에서 열은 다음과 같이 표기됩니다.
- 1 → A
- 2 → B
- 26 → Z
- 27 → AA
- 28 → AB
예를 들어 입력값이 29라면 출력은 AC가 됩니다.
해결 알고리즘
이 문제는 일반적인 26진법 변환과 비슷해 보이지만, 스프레드시트 열 번호에는 0에 해당하는 자릿수가 없다는 점이 다릅니다. 따라서 각 자릿수를 계산하기 전에 n에서 1을 먼저 빼주어야 합니다. 전체 해결 과정은 다음과 같습니다.
- n이 0이 아닌 동안 아래 작업을 반복합니다.
- n에서 1을 뺍니다 (n := n - 1).
- (n mod 26)에 문자 'A'의 ASCII 값을 더한 결과를 결과 문자열 res에 추가합니다.
- n을 26으로 나눕니다 (n := n / 26).
- 반복이 끝나면 결과 문자열 res를 뒤집습니다.
- res를 반환합니다.
예제 코드 (C++)
더 나은 이해를 돕기 위해 다음 C++ 구현 예제를 살펴보겠습니다.
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string convertToTitle(int n) {
string res;
while(n){
res += (--n)%26 + 'A';
n /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};
main(){
Solution ob;
cout << (ob.convertToTitle(30));
}
입력
30
출력
AD
코드 동작 원리
입력값 30에 대해 코드가 어떻게 동작하는지 단계별로 살펴보겠습니다.
- 첫 번째 반복: n이 29가 되고, 29 % 26 = 3이므로 네 번째 알파벳인 'D'가 결과에 추가됩니다. 이후 n = 29 / 26 = 1이 됩니다.
- 두 번째 반복: n이 0이 되고, 0 % 26 = 0이므로 'A'가 추가됩니다. 이후 n = 0이 되어 반복이 종료됩니다.
- 이 시점에서 res는 "DA"이며, 이를 뒤집으면 최종 결과인 "AD"를 얻습니다.
이처럼 낮은 자릿수부터 차례대로 계산되기 때문에 마지막에 문자열을 뒤집어 주는 것이 핵심입니다. 이 알고리즘은 임의의 큰 열 번호에 대해서도 정확하게 동작하며, 시간 복잡도는 O(log₂₆n)으로 매우 효율적입니다.