1 minute read

백준 11005번: 진법 변환 2

문제:

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, …, F: 15, …, Y: 34, Z: 35

입력:

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

풀이:

  • 이 문제를 풀기 위해서는 10진수를 n진수로 변환하는 방법을 알고 있어야 된다. 10진수를 n진수로 변환하는 방법은 10진수를 2진수로 변환하는 아래 그림과 같은 방법에서 2로 나누는 것을 n으로 바꿔어서 풀어주면 된다. 나머지도 똑같이 기록하여 나머지 그대로 아래서부터 위로 출력해주면 된다.

출처: [https://ourcalc.com/2진수-변환기/](https://ourcalc.com/2%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98%EA%B8%B0/)

출처: https://ourcalc.com/2진수-변환기/

  • 여기서 주의해야 할 점은 11진수부터의 표현법인데 if문을 이용하여 11진법 이상인 경우와 10진법 이하인 경우를 나누어 주면 된다. 그 방법으로는 if문에서 나머지가 10이상인지 미리 확인해주면 된다.
  • 알파벳을 넣어줄 때는 ASCII 코드를 이용하여 ‘A’ ASCII 값에 나머지의 값에서 10을 빼준 값을 더해주면 된다. 예를들면, 나머지가 10인 경우에 ‘A’가 출력 되어야 되기 때문에 ‘A’+0을 하게 만들어주면 된다. 그러면 나머지 값(number%n)이 0이 되게 하면 된다. 그러므로 나머지가 10인 경우에는 10을 빼주면 된다. 만약에 ‘B’면 ‘A’+1이기 때문에 나머지가 1이 되어야 되므로 11-10을 하여 1을 만들어주면 된다. 그렇게 해서 나온 식인 ‘A’+number%n-10의 문자열을 push 해주면 된다.

코드:

#include <iostream>
#include <stack>

using namespace std;

int main(){
	int number, n;
	stack<char> answer;
	//입력 
	cin >> number >> n;
	//진법 변환 구현 
	while(number > 0) {
		//나머지가 10이상인 경우 스택에 알파벳 push(11진법 이상인 경우) 
		if(number%n >= 10) answer.push((char)('A'+number%n-10));
		//나머지가 9이하인 경우 나머지인 숫자값 push(10진법 이하인 경우)
		else answer.push((char)(number%n+'0'));
		//숫자를 반내림으로 나누어 줌 
		number /= n;
	}
	//출력 
	while(!answer.empty()){
		cout<<answer.top();
		answer.pop();
	}
}

Leave a comment