Post

[백준BOJ11005 C++] 진법 변환 2

[백준BOJ11005 C++] 진법 변환 2

문제

https://www.acmicpc.net/problem/11005


풀이

진법 변환 문제에서 작성한 코드와 알고리즘을 반대로 작성하면 된다. 해당 문제 풀이는 작성해두었다.

  1. 진법 image

    위 사진은 10진법을 B진법으로 변환하는 방법이다. 사진을 예시로 10진법인 63을 2진법으로 변환하기 위해서는 2로 나눠서 나온 나머지로 값을 구성한다. 앞으로 설명할 코드에서는 왼쪽 원리를 이용해 오른쪽처럼 출력할 값을 받을 것이다. 63을 0번째 자릿수에 둔 후, 2로 나누면 36을 1번째 자릿수로 이동하고 나온 나머지값은 0번째에 할당한다.

  2. 입출력 조건

    이번에는 입력받을 값이 항상 10억보다 작거나 같기 때문에 long long int로 작성한다. 그리고 위처럼 출력할 값을 받기 위해서는 char n[30]으로 작성하는데 이유는 다음과 같다.

    1. 10진법에서 넘는 숫자는 A, B… 등 알파벳으로 나타내야 한다

    2. 10억보다 작거나 같을 long long int을 B진법에 따라 제대로 출력하기 위해서는 char 크기를 30으로 둔다. (실제로 20에서 오류가 났다)

    초기화를 위해 fill_n(n, 30, ‘0’) 으로 초기화한 후, n 배열의 크기에 따라 int l = 30; 을 선언한다.

  3. 계산 if (N == 0)은 앞으로 작성할 코드에서 일어날 오류를 방지하기 위해 작성했다. else는 0이 아닌 숫자를 입력받을 때 실행된다. re는 reminder의 준말로 작성해뒀으며, 이것은 나머지를 받는다. 나머지가 10보다 클 경우 아스키코드를 기준으로 ‘A’ 이상이 나오도록 설정하고, 아닐 경우는 ‘0’을 더하여 제대로 된 숫자가 나오도록 한다.

    이것을 N[29]부터 입력받는다. (위 사진의 0번째 자리처럼 char N 배열의 인덱스 29부터 받는다는 뜻이다) 이렇게 된다면 N의 인덱스를 추적 역할을 할 l은 1씩 더해서 인덱스 뒤로 가는 것이 아니라, 오히려 1씩 빼서 28, 27… 이렇게 가는 것이다.

    이 과정을 N이 B로 나뉘어 값이 0 이하로 되기 전까지 반복한다.

  4. 출력 방법 마지막은 간단하지만 이해가 안갈 수도 있어서 작성해본다면 만약 10진법 63을 2진법 1001001로 나타난다면, 사용한 인덱스는 23~29이다. 즉, 현재 l값은 ‘23’이다. 따라서 23~29까지 l++ 반복문을 통해 N[l]의 값이 얼마인지 확인할 수 있다.


제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	long long int N = 0; int B = 0;

	cin >> N >> B;
	char n[30];
	fill_n(n, 30, '0');
	int l = 30;

	if (N == 0) {
		n[29] = '0';
		l--;
	}

	else {
		while (N > 0) {
			int re = N % B;
			if (re >= 10) n[l - 1] = re + '7';
			else n[l - 1] = re + '0';
			l--;
			N /= B;
		}
	}

	for (; l < 30; l++) cout << n[l];

	return 0;
}
This post is licensed under CC BY 4.0 by the author.