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

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

스프레드시트의 열 제목은 알파벳 문자로 구성됩니다. 첫 번째 열은 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을 빼주는 보정 작업이 필요합니다.

  1. n을 26으로 나눈 나머지(rem)를 구합니다.
  2. rem이 0이면 문자열에 'Z'를 추가하고, n을 n/26 − 1로 갱신합니다.
  3. rem이 0이 아니면 (rem − 1) + 'A'에 해당하는 문자를 추가하고, n을 n/26으로 갱신합니다.
  4. 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)입니다.