[백준] 2745, 진법 변환

YUN·2026년 2월 22일

C++

목록 보기
46/85


B 진법 수를 입력받아서 10진수로 출력하는 문제이다.

이 문제의 핵심은

(1) B 진법 -> 10진법 계산을 위한 누적 방식
(2) char가 문자인지 숫자 인지 확인

이다.

1. 나의 풀이 (오답)

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

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    string s;
    int B;
    int sum = 0;
    cin >> s >> B;
    int len = s.size();
    for(int i=len; i>0; i--) {
        if(s[len-i] >= '0' && s[len-i] <= '9') {
            sum+= (s[len-i]-'0') * B^(i-1);
        } else {
            sum+=(s[len-i]-'A'+10) * B^(i-1);
        }
    }
    cout << sum;
}

왜 틀렸나 했는데, 바보같이 지수 연산자^로 착각했다.

C++ 에서 ^비트 xor 이다.

나는 바보같이 비트 xor을 계속 해주고 있었다.

C++ 에서 지수 연산을 위해서는 pow() 함수를 사용해야한다.

#include <cmath>

double r = pow(a, b);   // a의 b제곱

pow 함수는 위와 같이 사용한다.

이를 적용하면 아마 옳은 답이 나오지않을까싶다.

2. 다른 풀이 (정답)

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

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    string s;
    int B;
    int sum = 0;
    int digit;
    cin >> s >> B;
    for(char c : s) {
        if(isalpha(c)) digit = c-'A'+10;
        else digit = c-'0';
        sum = sum*B + digit;
    }
    cout << sum;   
}

우선, char가 문자인지 숫자인지 확인은 <cctype>isalpha() 함수를 사용했고,

누적은 sum = sum * B + digit 으로 매 반복마다 B가 곱해지도록 하였다.

가장 큰 자릿수부터 반복을 실행하기때문에 위의 방식대로 매 반복마다 B가 곱해져야

10진수 변환이 제대로된다.

3. 배운 점 (느낀 점)

(1) 진법 변환

sum = sum * B + digit 으로 매 반복마다 B를 곱하며 10진수로 변환하는 코드는 외워놓으면 아이디어적 측면에서 유용하게 쓸 수 있을 것 같다.

(2) isalpha()

isalpha() 안쓰고 if ('0' <= c && c <= '9') 이렇게 하는 방법도 존재한다.

둘 중 뭘쓰든 관계없을듯하다.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글