문제
리뷰
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 |