728x90

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

 

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

 

예제 입력 1 

ZZZZZ 36

 

예제 출력 1 

60466175
 

 

알고리즘 분류

  • 수학
  • 구현
  • 문자열

 

문제 출처

https://www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

 

 

문제 해결 방법

  • 진법 변환의 원리를 알면 간단하게 풀 수 있는 문제였다.
$$1011_{2} = 1 \times 2^{3} + 0 \times 2^{2} + 1 \times 2^{1} + 1 \times 2^{0} = 8 + 0 + 2 + 1 = 11$$

 

  • 단, 입력 받은 문자열(@N@)의 각각 요소에 접근하면서 요소가 @0@ ~ @9@ 사이의 값일 경우 숫자로, @9@ 초과일 경우(문자 @A@ ~ @Z@)일 경우 @10@ ~ @35@ 사이의 수로 변환해주어야 한다.
    • 이 변환 알고리즘을 이해하려면 아스키 코드를 잘 알고 있어야 한다.
// 해당 문자가 숫자일 경우 숫자를, 문자(A-Z)일 경우 10에서 35 사이의 숫자를 반환한다.
int tmp = ('0' <= n[i] && n[i] <= '9') ? n[i] - '0' : n[i] - 55;

 

코드

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

string N;
int B;

void Input() {
    cin >> N >> B;
}

int Solution(string n, int b) {
    int len = n.length();
    int sum = 0;

    for (int i = 0; i < len; i++) {
        // 해당 문자가 숫자일 경우 숫자를, 문자(A-Z)일 경우 10에서 35 사이의 숫자를 반환한다.
        int tmp = ('0' <= n[i] && n[i] <= '9') ? n[i] - '0' : n[i] - 55;

        sum += tmp * pow(b, len - (i + 1));
    }

    return sum;
}

void Output() {
    cout << Solution(N, B) << '\n';
}

void Solve() {
    Input();
    Output();
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [일반 수학 1]
  • 브론즈II

 

아스키 코드표

  • 숫자 : @48@(0) ~ @57@(9)
  • 문자
    • 대문자 : @65@(A) ~ @90@(Z)
    • 소문자 : @97@(a) ~ @122@(z)
    • 대문자소문자의 차이는 @32@

728x90