[백준]11005, 10진법 -> n진법 변환

YUN·2026년 2월 23일

C++

목록 보기
48/85

10진법 -> n진법으로 변환하는 문제이다.

(1) 10진법 -> n진법 변환법 알기
(2) 나머지가 10보다 크면 문자로 출력하기
(3) 문자를 출력해야하니 -> string 사용

이렇게 3개가 이 문제의 핵심이다.

우선, 10진법 -> n진법은 아래와 같이 변환한다.

쉽게 말해서 N/B가 0이될때까지 나누기를 수행해주고, 각 나누기 단계에서 나온 나머지 N % B 를 역순으로 출력해주면 된다.

1. 나의 코드

// N=39, B=2   32+4+2+1 -> 100111

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string s="";
    int N,B;
    char tmp;
    int rem;
    cin >> N >> B;
    while (N>=B) { //2>=2
        rem = N%B; //rem=0
        N = N/B; //N=1
        if(rem>=10) tmp=(char)(rem-10+'A'); //
        else tmp=rem+'0';
        s.push_back(tmp); // 111001
    }
    if(N>=10) tmp =(char)(N-10+'A');
    else tmp=N+'0';
    s.push_back(tmp);
    reverse(s.begin(), s.end());
    cout << s;
    return 0;
}

나는 N>=B인동안만 나누기를 수행하고 마지막에 N을 덧붙여주는 식으로 코드를 작성했다.

또한, 역순 출력을 위해 s.reverse()를 사용하였다.

다른 풀이를 본 상태에서 나의 풀이를 보면 항상 비효율적이고, 불필요하게 코드 길이만 늘리는 코드가 정말 많은 것 같다.

2. 다른 풀이

#include <iostream>
    
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, B, rem;
    string s="";
    cin >> N >> B;
    while(N>0) {
        rem=N%B;
        N = N/B;
        rem >= 10 ? s+=char(rem-10+'A') : s+=char(rem+'0');
    }
    for(int i=s.size()-1;i>=0;i--) cout << s[i];
    return 0;
}

한 눈에 봐도 매우 매우 매우 매우 매우 간결하다.

핵심적인 원리는 동일하다.

다만, 나누기를 N이 0이될때까지 반복문에서 수행하고 , 마지막에 reverse()안쓰고 인덱스 역순으로 string을 순회하며 출력한다는 것이 차이점이다.

3. 배운 점 (느낀 점)

(1) string과 char를 + 연산시 char -> string 형 변환

s+=char(rem+'0')

위와 같이 string과 char를 + 연산시 char -> string 으로 형 변환된다.

(2) 역순 출력이 필요할때

굳이 reverse() 쓸 필요 없다. 그냥 string을 역순으로 순회해주면 된다.

(3) string 비어있는 상태로 초기화

string을 비어있는 상태로 초기화하려면

string s1 = "";

으로 초기화해주면 된다.

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

0개의 댓글