근본없는 코딩

[C++] 백준2745 진법변환 본문

✔ Online Judge

[C++] 백준2745 진법변환

근본없는 개발자 2023. 6. 26. 23:09

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int b, sum = 0;
	string n;
	cin >> n >> b;

	for (int i = 0; i < n.length(); i++) {
		int tmp = 1;
		// math 라이브러리를 사용한다면 아래 for문은 생략 가능
		for (int j = 0; j < n.length() - i - 1; j++) {
			tmp *= b;
		}

		if (n[i] >= '0' && n[i] <= '9') {
			sum += (n[i] - '0') * tmp;
		}
		else {
			sum += (n[i] - 'A' + 10) * tmp;
		}
	}

	cout << sum << '\n';

	return 0;
}

 

✔️ 문제 이해

. B 진법을 계산하는 방식은, 가장 오른쪽 부터 해당 값에서 B의 0승으로 곱을 해주면 된다.

. 즉 '12345'가 36진법이라고 하면, 1*(36^4) + 2*(36^3) + 3*(36^2) + 2*(36^1) + 1*(36^0) 으로 계산하면 된다.

B진법 수 (B=36)
Z = 35
Z
Z
Z
Z
B^n (36^n)
36^4 = 1679616
36^3 = 46656
36^2 = 1296
36^1 = 36
36^0 = 1
Z * B^n (35 * 36^n)
58786560
1632960
45360
1296
35
sum
60466175

 

✔️ 풀이 방법

① 입력: b는 문자열로 입력받는다. 몇 자리의 수라고 지정이 되지 않았다.

② 자릿수만큼 반복문: 각 자리수별로 계산하여 sum을 해주는 방식이므로, 반복문은 자릿수 만큼 진행한다.

③ B의 n승 값 우선 구하기

. 만약 math 라이브러리를 사용한다면, for 문을 하나 줄일 수 있다.

. math 라이브러리를 사용하지 않았기 때문에, 36^n 계산을 따로 먼저 진행하였다.

. 현재 자리수의 B^n의 계산을 먼저 tmp에 저장한다.

④ 현재 자리수의 값 구하기

. 만약 0~9라면 해당 값을 그대로 사용해서 위에서 구한 tmp와 곱하면 된다. 다만 그대로 사용한다는 의미는 숫자로 사용한다는 것이기 때문에, 현재는 문자열이므로 -'0'을 해준다.

. 만약 A~Z라면, 10~35의 의미이므로 -'A'를 해준 후 +10을 하면 A=10~Z=35의 값으로 계산된다. 마찬가지로 tmp를 곱한다.

⑤ sum 출력하면 끝!

'✔ Online Judge' 카테고리의 다른 글

[C++] 백준25083 새싹  (0) 2023.06.29
[C++] 백준11005 진법변환2  (0) 2023.06.26
[C++] 백준2042 구간 합 구하기  (0) 2023.06.25
[C++] 백준11718 그대로 출력하기  (0) 2023.06.25
[C++] 백준5622 다이얼  (0) 2023.06.25