728x90
728x90
문제
B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
출력
첫째 줄에 B진법 수 N을 10진법으로 출력한다.
예제 입력 1
ZZZZZ 36
예제 출력 1
60466175
알고리즘 분류
- 수학
- 구현
- 문자열
문제 출처
https://www.acmicpc.net/problem/2745
2745번: 진법 변환
B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를
www.acmicpc.net
문제 해결 방법
- 진법 변환의 원리를 알면 간단하게 풀 수 있는 문제였다.
- 단, 입력 받은 문자열(
N
)의 각각 요소에 접근하면서 요소가0
~9
사이의 값일 경우 숫자로,9
초과일 경우(문자A
~Z
)일 경우10
~35
사이의 수로 변환해주어야 한다.- 이 변환 알고리즘을 이해하려면 아스키 코드를 잘 알고 있어야 한다.
// 해당 문자가 숫자일 경우 숫자를, 문자(A-Z)일 경우 10에서 35 사이의 숫자를 반환한다. int tmp = ('0' <= n[i] && n[i] <= '9') ? n[i] - '0' : n[i] - 55;
코드
#include <iostream> #include <string> #include <cmath> using namespace std; string N; int B; void Input() { cin >> N >> B; } int Solution(string n, int b) { int len = n.length(); int sum = 0; for (int i = 0; i < len; i++) { // 해당 문자가 숫자일 경우 숫자를, 문자(A-Z)일 경우 10에서 35 사이의 숫자를 반환한다. int tmp = ('0' <= n[i] && n[i] <= '9') ? n[i] - '0' : n[i] - 55; sum += tmp * pow(b, len - (i + 1)); } return sum; } void Output() { cout << Solution(N, B) << '\n'; } void Solve() { Input(); Output(); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); Solve(); return 0; }
채점 결과

참고
- [단계별로 풀어보기] > [일반 수학 1]
- 브론즈II
아스키 코드표
- 숫자 :
48
(0) ~57
(9) - 문자
- 대문자 :
65
(A) ~90
(Z) - 소문자 :
97
(a) ~122
(z) - 대문자와 소문자의 차이는
32
- 대문자 :

728x90
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ-9063][C++] 대지 (0) | 2023.06.20 |
---|---|
[BOJ-2903][C++] 중앙 이동 알고리즘 (0) | 2023.06.19 |
[BOJ-2720][C++] 세탁소 사장 동혁 (0) | 2023.06.18 |
[BOJ-11005][C++] 진법 변환 2 (0) | 2023.06.17 |
[BOJ-15894][C++] 수학은 체육과목 입니다 (1) | 2023.03.21 |
[BOJ-9506][C++] 약수들의 합 (0) | 2023.03.11 |
[BOJ-2501][C++] 약수 구하기 (0) | 2023.03.11 |
[BOJ-27866][C++] 문자와 문자열 (0) | 2023.03.11 |