문제 개요
양의 정수가 하나 주어졌을 때, 이를 엑셀 시트에서 실제로 사용되는 열 제목으로 변환하는 문제입니다. 엑셀의 열 제목은 다음과 같은 규칙을 따릅니다.
- 1 → A
- 2 → B
- 26 → Z
- 27 → AA
- 28 → AB
예를 들어 입력값이 28이라면 출력 결과는 AB가 됩니다.
접근 방법
이 문제는 26진법 변환과 유사하지만, 엑셀 열 제목에는 '0'에 해당하는 개념이 없다는 점이 특징입니다. 즉, A부터 Z까지가 1~26에 대응하기 때문에 일반적인 진법 변환과는 약간 다른 처리가 필요합니다.
해결 알고리즘은 다음과 같습니다.
- n이 0이 아닌 동안 아래 과정을 반복합니다.
- n에서 1을 뺍니다 (n = n - 1)
- (n mod 26)에 'A'의 ASCII 값을 더한 문자를 결과 문자열에 추가합니다
- n을 26으로 나눕니다 (n = n / 26)
- 결과 문자열을 뒤집습니다
- 뒤집힌 문자열을 반환합니다
반복문 안에서 n을 미리 1 감소시키는 이유는, 엑셀 열 번호가 0이 아닌 1부터 시작하기 때문입니다. 이렇게 하면 각 자리의 값이 0~25 범위로 조정되어 일반적인 진법 변환처럼 깔끔하게 처리할 수 있습니다.
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 = 30 → 먼저 29로 감소 → 29 % 26 = 3 → 'D' 추가 → n = 29 / 26 = 1
- 두 번째 반복: n = 1 → 먼저 0으로 감소 → 0 % 26 = 0 → 'A' 추가 → n = 0 / 26 = 0
- 반복 종료 후 생성된 문자열 "DA"를 뒤집으면 최종 결과인 "AD"가 됩니다.
이처럼 낮은 자리 문자부터 차례대로 만들어진 뒤 마지막에 뒤집기 때문에, 올바른 순서의 열 제목을 얻을 수 있습니다. 시간 복잡도는 O(log₂₆n)으로 매우 효율적입니다.