[진법변환] 11005. 진법 변환2

알고리즘/백준 알고리즘

2020. 5. 1. 20:31

1. 문제 해결 전략

해결법이 안떠올랐다. 나눗셈 연산과 나머지 연산이 필요한 것과 아스키코드 변환이 필요할 것이라는 생각은 했지만 구현에 있어서 부족함을 많이 느낀 문제였다. 해당 코드는 다른 블로그에 있는 코드를 참조했다.

출처 : https://sihyungyou.github.io/baekjoon-11005/

 

백준 11005번 : 진법 변환 2

진법 변환

sihyungyou.github.io

 

#include <cstdio>
#include <stack>

using namespace std;

int main () {

    int N, B;
    stack <int> s;

    scanf("%d %d", &N, &B);

    while(1) {
        if (N == 0) break;
        s.push(N%B);
        N /= B;
    }

    while(!s.empty()) {
        s.top() < 10 ? printf("%d", s.top()) : printf("%c", s.top() + 55);
        s.pop();
    }

    printf("\n");

    return 0;
}

일단 비슷한 유형이 많을 것 같아서 짚고 넘어가야 할 것 같아서 자세히 다루어 보겠다.

이 문제는 십진법의 수를 1~26진법까지 변환을 하는 문제이고, 10진법을 넘어갔을 때 각자리의 표기법은 

대문자 'A' ~ 'Z'까지로 대체한다.

 

핵심은 while문이다. GCD에서부터 이 문제까지 계속해서 나머지/ 나눗셈 연산을 필요로 하고 있다.

가장 간단하게 2진법을 생각해보자. 7이라는 숫자가 들어왔고 이 수를 2진법으로 바꾸려면 어떻게 해야 할까?

7을 2진법으로 나타내면 111이다. 각 자리들은 7을 2로 몇번 나눠졌는지로 정해지며, 각 자리수는 2로 나눈 나머지 값이 들어가게 된다. 7을 N번 나누어 값이 0이 되었을 때까지 반복하게 된다.

7/2 = 3 , 7%2 =1

3/2 = 1, 3%2 = 1

1/2 = 0, 1%2 =1 

 

하나의 예를 더 들어서 129를 12진법으로 바꾸어보자. 

129/12 = 10 , 129%12 = 9

10/12 = 0 , 10 % 12 = 10

 

따라서 A9(16)이 된다.

이제 이렇게 바꾸어진 각 자리수들을 어떻게 저장한 후 출력하는지에 대해 생각을 해야하는데

위의 12진법에서도 봤듯이 10이상의 숫자들은 알파벳으로 대체된다.

코드를 보면 되게 간단하게 풀이가 되어있는데, stack에 자리수가 작은 수들부터 집어넣은후

출력할 때는 큰 자릿수 부터 꺼내서 10이상인지 아닌지를 체크하여 해결을 한다.

 

2. 걸린 시간

실패

 

3. 느낀점

기본적인 문제도 못푼 자신이 한심해졌다. 

가끔 이렇게 못푼 문제를 구글에 올라온 풀이를 보며 이해하려 할 때, 그 코드가 무지하게 짧으면 더 허탈한 것 같다 ㅋㅋ. 진법문제는 처음 풀어봤는데 다음엔 맞출수 있겠지..

4. 링크

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