본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 2745 진법 변환

by 해적거북 2021. 7. 29.
728x90

● [문제번호 2745] 진법 변환

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

 

2745번: 진법 변환

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

www.acmicpc.net

 

● 알아야 할 것

: 진법을 변환하는 방법

: 알파벳 대문자 출력을 위한 ASCII 코드

 

● 풀이 과정

: 정수형 자료형으로 주어지는 수 N을 입력받으면 11진법 이상에서 나오는 A ~ Z 의 수를 입력받을 수 없다.

따라서 문자열 string을 이용하여 N을 입력 받는다.

 

: 주어진 수 N의 뒷자리부터 B진법에 알맞는 가중치를 계속 곱하면서 변환된 수를 만들어간다.

주어진 조건에서 "B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다." 이므로

결과값은 int형으로 선언해도 된다.

 

● 주의 할 것

: 10진법을 넘어가는 숫자는 ASCII 코드를 참고하여 변환한다.

 

● 참고 할 것

: 진수 변환에 대한 이해

https://m.blog.naver.com/icbanq/221727893563

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

// 정수 자료형을 사용하면 10진법을 넘어가는 수의 알파벳대문자를 입력받지 못한다
string N;
// 10진법으로 변환된 수를 저장할 result 변수
int B, result;

// B진법의 수를 10진법으로 변환
void change()
{
    // B의 n제곱으로 커지는 가중치
    int weight = 1;
    
    // 뒤에서부터 변환
    for(int n = N.length() - 1; n >= 0; n--)
    {
        // 0 ~ 9 까지의 수 인 경우
        if('0' <= N[n] && N[n] <= '9')
            result += (N[n] - '0') * weight;
        
        // A ~ Z 까지의 수 인 경우
        else if('A' <= N[n] && N[n] <= 'Z')
            result += (N[n] - 'A' + 10) * weight;
        
        // 가중치를 B의 n제곱으로 만들어간다
        weight *= B;
    }
    
    // 10진법으로 저장된 수 출력
    cout << result;
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    // B진법 수 와 B진법 입력
    cin >> N >> B;
    
    // 10진법으로 변환
    change();
    
    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [303 - 수학 1 (참고)] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 11005 진법 변환 2 https://pirateturtle.tistory.com/195
2 2745 진법 변환 https://pirateturtle.tistory.com/196
3 11576 Base Conversion https://pirateturtle.tistory.com/197
4 11653 소인수분해 https://pirateturtle.tistory.com/198

 

728x90

댓글