근본없는 코딩
[C++] 백준2745 진법변환 본문
#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 |