Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 엑셀 시트 열 제목 변환하기

문제 개요

양의 정수가 하나 주어졌을 때, 이를 엑셀 시트에서 실제로 사용되는 열 제목으로 변환하는 문제입니다. 엑셀의 열 제목은 다음과 같은 규칙을 따릅니다.

  • 1 → A
  • 2 → B
  • 26 → Z
  • 27 → AA
  • 28 → AB

예를 들어 입력값이 28이라면 출력 결과는 AB가 됩니다.

접근 방법

이 문제는 26진법 변환과 유사하지만, 엑셀 열 제목에는 '0'에 해당하는 개념이 없다는 점이 특징입니다. 즉, A부터 Z까지가 1~26에 대응하기 때문에 일반적인 진법 변환과는 약간 다른 처리가 필요합니다.

해결 알고리즘은 다음과 같습니다.

  1. n이 0이 아닌 동안 아래 과정을 반복합니다.
    • n에서 1을 뺍니다 (n = n - 1)
    • (n mod 26)에 'A'의 ASCII 값을 더한 문자를 결과 문자열에 추가합니다
    • n을 26으로 나눕니다 (n = n / 26)
  2. 결과 문자열을 뒤집습니다
  3. 뒤집힌 문자열을 반환합니다

반복문 안에서 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에 대해 코드가 어떻게 동작하는지 단계별로 살펴보겠습니다.

  1. 첫 번째 반복: n = 30 → 먼저 29로 감소 → 29 % 26 = 3 → 'D' 추가 → n = 29 / 26 = 1
  2. 두 번째 반복: n = 1 → 먼저 0으로 감소 → 0 % 26 = 0 → 'A' 추가 → n = 0 / 26 = 0
  3. 반복 종료 후 생성된 문자열 "DA"를 뒤집으면 최종 결과인 "AD"가 됩니다.

이처럼 낮은 자리 문자부터 차례대로 만들어진 뒤 마지막에 뒤집기 때문에, 올바른 순서의 열 제목을 얻을 수 있습니다. 시간 복잡도는 O(log₂₆n)으로 매우 효율적입니다.