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

C++로 열 번호를 스프레드시트 열 제목으로 변환하는 프로그램

문제 소개

양의 정수가 하나 주어졌을 때, 이 숫자에 해당하는 스프레드시트(엑셀)의 열 제목을 찾아야 합니다. 스프레드시트에서 열은 다음과 같이 표기됩니다.

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

예를 들어 입력값이 29라면 출력은 AC가 됩니다.

해결 알고리즘

이 문제는 일반적인 26진법 변환과 비슷해 보이지만, 스프레드시트 열 번호에는 0에 해당하는 자릿수가 없다는 점이 다릅니다. 따라서 각 자릿수를 계산하기 전에 n에서 1을 먼저 빼주어야 합니다. 전체 해결 과정은 다음과 같습니다.

  1. n이 0이 아닌 동안 아래 작업을 반복합니다.
  2. n에서 1을 뺍니다 (n := n - 1).
  3. (n mod 26)에 문자 'A'의 ASCII 값을 더한 결과를 결과 문자열 res에 추가합니다.
  4. n을 26으로 나눕니다 (n := n / 26).
  5. 반복이 끝나면 결과 문자열 res를 뒤집습니다.
  6. 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)으로 매우 효율적입니다.