[Coding Test] 진법 변환 (후위 순회로 뒤부터 출력하기)

문제

A진법 수 S를 입력 받아 B진법 수로 출력하는 프로그램을 작성하시오.

S에 사용되는 값은 0 ~ 9, A ~ Z이다.

각 조건은 다음과 같다.

  • $2 \leq A, B \leq 36$
  • $0 \leq S \leq 2^{63} - 1$

풀이

참고로 문제 강의는 54분으로 제일 길었는데, 처음으로 풀이 없이 푼 문제다.

그래서 아직 강의내용을 모름.

적용한 스킬은 아래와 같다.

  • typedef long long ll
  • 후위 순회 이용해 높은 자리수부터 출력하기
  • char 형 데이터 자동 변환

소스코드

#include<iostream>
#include<string>
 
using namespace std;
typedef long long ll;
ll A, B;
string S;
 
void print_answer(ll num) {
    if (num == 0) return;
    ll Mod = num % B;
 
    // 후위 순회
    print_answer(num / B);
 
    // 답출력
    if (Mod < 10) cout << Mod;
    else cout << (char)(Mod - 10 + 'A');
}
 
int main(int argc, char* argv[])
{
    // freopen("sample_input.txt", "r", stdin);
 
    while (true) {
        cin >> A;
        if (A == 0) break;
 
        cin >> S >> B;
        if (S.length() == 1 && S[0] == '0') {
            cout << 0 << '\n';
            continue;
        }
 
        int length = S.length();
        ll num = 0;
 
        for (int i = 0; i < length; i++) {
            if ('A' <= S[i])
                num = (num * A) + S[i] - 'A' + 10;
            else
                num = (num * A) + S[i] - '0';
        }
 
        // 10진수 변환 값 전달
        print_answer(num);
        cout << '\n';
    }
 
    return 0;
}

Updated:

Leave a comment