728x90

문제

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

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

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

 

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

 

출력

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

 

예제 입력 1

60466175 36

 

예제 출력 1 

ZZZZZ
 

 

알고리즘 분류

  • 수학
  • 구현

 

문제 출처

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

 

11005번: 진법 변환 2

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

www.acmicpc.net

 


 

문제 해결 방법

  • <진법 변환 1> 문제와 정반대의 방식으로 풀었던 문제였다. 10진법에서 @B@ 진법으로 변환하려면, 10진법의 수(@N@)를 이 @0@이 될 때까지 @B@로 계속 나누면서 나머지(@mod@)를 구하면 된다.
10진법에서 8진법/16진법/2진법을 구하는 예. ⓒ&nbsp;10000calculator.com

 

  • @N@을 @B@로 나눠가면서 나머지 값(@mod@)을 문자열 변수(@S@)에 푸시(@push_back@) 해준다. 그리고 동시에 @N@을 @B@로 나눠주면서 @N@의 크기를 줄여 나간다. 이와 같은 동작을 @N@이 @0@이 될 때까지 반복한다.
    • 문자열 변수(@S@)에는 나머지 값(@mod@)을 @char@ 형 데이터(@elem@)로 변환하여 넣을 것이다.
      • 나머지 값(@mod@)이 @10@ 이상일 경우, @A@부터 @Z@까지 표시해줘야 하므로 @55@를 더해준다.
      • 나머지 값(@mod@)이 @9@ 이하인 경우, @0@부터 @9@까지 표시해줘야 하므로 @48@을 더해준다.
  • 문자열 변수(@S@)에는 요소들이 뒤에서 부터 넣어지게 되므로, 최종적으로 요소의 위치를 역순으로 바꿔주는 작업을 해주어야 한다. @<algorithm>@ 헤더에 있는 @reverse()@ 함수를 사용하여 요소의 위치를 뒤집어준다.
string Solution(int n, int b) {
    int mod;
    char elem;

    while (n != 0) {
        mod = n % b;

        if (mod > 9) {    // 나머지가 10 이상이면
            elem = mod + 55;    // A ~ Z에 해당하는 문자로 변환한다. (아스키 코드)
        }
        else {    // 나머지가 1 이상 9 이하이면
            elem = mod + 48;     // 0 - 9에 해당하는 숫자로 변환한다. (아스키 코드)
        }

        S.push_back(elem);

        n /= b;
    }

    // 요소 위치 뒤집기
    reverse(S.begin(), S.end());

    return S;
}

 

코드

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

int N, B;
string S;

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

string Solution(int n, int b) {
    int mod;
    char elem;

    while (n != 0) {
        mod = n % b;

        if (mod > 9) {    // 나머지가 10 이상이면
            elem = mod + 55;    // A ~ Z에 해당하는 문자로 변환한다. (아스키 코드)
        }
        else {    // 나머지가 1 이상 9 이하이면
            elem = mod + 48;     // 0 - 9에 해당하는 숫자로 변환한다. (아스키 코드)
        }

        S.push_back(elem);

        n /= b;
    }

    // 요소 위치 뒤집기
    reverse(S.begin(), S.end());

    return S;
}

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]
  • 브론즈 I

 

아스키 코드표

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

728x90