문제

진법변환2 백준 11005번

리뷰

10진수 N을 B진수로 바꾸려면, N을 B로 나눈 나머지를 적어주다가 거꾸로 출력하면 된다.

계속 B로 나누는 것이다.

    while( N > 0){
        answer.push_back( N % B );
        N /= B; 
    }

문제의 조건에서 10 부터는 알파벳으로 표현하라고 했다.

그래서 10부터는 아스키코드를 이용해서 출력했다. 10일 때는 'A'를, 11 일 때는 'B' 로 출력해야 한다.

'A'는 65니까, 10 + 55 로 'A' 를 표현할 수 있다.

    for(int i = answer.size()-1; i >= 0 ; i--){ // 거꾸로 출력  

        if(answer[i] < 10){
            cout<< answer[i];
        }else{
            printf("%c", answer[i]+55);  // char 로 'A'는 10진수 65와 같다 
        }
    }

맞은 코드 1

#include <iostream> 
#include <vector>
using namespace std;

int main(void){

      int N = 0, B = 0; 
    vector<int> answer; 

    cin >> N >> B;

    while( N > 0){
        answer.push_back( N % B );
        N /= B; 
    }

    for(int i = answer.size()-1; i >= 0 ; i--){ // 거꾸로 출력  

        if(answer[i] < 10){
            cout<< answer[i];
        }else{
            printf("%c", answer[i]+55);
        }
    }

    return 0;    
} 

stack을 이용한 다른 풀이

어차피 거꾸로 출력해야 하니까 '나머지 계산'한 것을 전부 스택에 push 하고,

스택일 빌 때까지 전부 pop 하면 된다.

알파벳을 출력하는 경우를 고려해서 char 를 저장하는 스택을 이용했다.

그런데 0부터 9까지는 어떻게 스택에 넣지? 싶어서 구글링 해보니까 4, 5 같은 숫자를 넣을때 앞에 문자로 '0'을 넣어준다.

맞은 코드 2

#include <iostream> 
#include <stack>
using namespace std;

int main(void){

      int N = 0, B = 0; 

    cin >> N >> B;

    //printf("%d %d\n", '9', 'A'); // 57 65  7차이  
    stack<char> answer;

    while(N){

        int temp = N % B;

        if(temp >= 10){
            temp += 7;
        }

        answer.push('0'+temp);

        N /= B;
    }    

    while(!answer.empty()){
        cout << answer.top();
        answer.pop();
    }

    return 0;    
} 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

2진수 8진수 백준 1373번  (0) 2020.09.15
진법변환 백준 2745번  (0) 2020.09.15
GCD합 백준 9613번  (0) 2020.09.15
조합 0의 개수 백준 2004번  (0) 2020.09.15
소인수분해 백준 11653번  (0) 2020.09.14

+ Recent posts