백준 진법 변환, 진법 변환 2 C++

박원빈·2024년 4월 19일

알고리즘 🤔

목록 보기
7/26
post-thumbnail

기수법이란?

2745번


소스코드

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

int main() {
    string str;
    int base;
    int result = 0;
    cin >> str >> base;
    for (int i = 0; i < str.length(); i++) {
        int strToNum = str[str.length() - (i + 1)];
        if ('0' <= strToNum && strToNum <= '9') {
            result += (strToNum - '0') * int(pow(base, i));
        } else {
            result += (strToNum - 'A' + 10) * int(pow(base, i));
        }
    }
    cout << result;
}

풀이 과정

진법이 정확이 무엇인지 몰라, 어제 구글링을 하며 기수법에 대한 포스팅을 했었습니다.
그리고 진법에 대해서 공부했고 10진법은 어떻게 구성되어있으며 어떻게 숫자로 표현하는지에 대해서도
공부하여 위 문제를 풀었습니다.
아스키코드를 활용하여 strToNum을 숫자로 바꿔준 뒤,
만약 아스키코드 0이나 9 사이에있으면 아스키코드 0을 strToNum에서 빼준 다음, base의 i제곱을 결과값에 추가합니다.
0이나 9 사이에 없다면 아스키코드 A에 10을 더해서 strToNum에서 빼준 다음, base의 i제곱을 결과값에 추가합니다.
그리고 최종적으로 반복문에서 빠져나오면 result를 출력해줍니다.
처음에는 정말 감이 잡히지 않았지만, 기수법에 대해서 알고나니 해결법이 보이는 문제였습니다.

11005번


소스 코드

#include <iostream>
using namespace std;

int main() {
    int num;
    int base;
    cin >> num >> base;
    int div = num;
    int count = 0;
    string answer = "";
    while (1) {
        if (0 <= div % base && div % base <= 9) {
            answer += to_string(div % base);
        } else {
            answer += char(div % base + 55);
        }
        count++;
        
        div = div / base;
        
        if (div == 0) {
            break;
        }
    }
    
    for (int i = count - 1; i >= 0; i--) {
        cout << answer[i];
    }
    }

풀이 과정

마찬가지로 10진법을 n진법으로 변환하는 방법을 알면 쉽게 풀리는 문제입니다.
다만 문제를 풀며 부딪힌 부분은 계산된것을 바로 출력해주는것이 아닌 거꾸로 뒤집어 출력을 해야되는 것이었습니다.
처음에는 c++의 동적 할당을 알아보다가, '단순히 문자열만 추가해주면 되는거 아닌가?' 라고 생각해
혹시몰라 문자열에 + 연산자가 작동하는지 찾아보았는데, c++에서도 지원을 하였습니다.
그로인해 출력에 대한 문제를 해결하였고, 정답을 맞추었습니다.

0개의 댓글