1. 문제 상세
https://www.acmicpc.net/problem/2745
2. 문제 접근
먼저 B진법 수 N을 문자열 형태로 입력받자.
조건과 같이 입력받은 문자열에서 문자들을 확인하여 0~9 와 A~Z 의 문자를 숫자로 변환하여 계산하기 위해서 문자들의 아스키코드 값을 활용하자.
문자가 0~9 인 경우, '0' 값을 빼주어 문자에서 숫자 0~9가 되고, A~Z 인 경우 55를 빼주어 A : 10, B : 11, ... Z : 35 가 되도록 한다.
문자열의 총 길이를 구한 후 0부터 문자열의 길이 - 1 까지의 수를 입력받은 B의 지수로 사용한다.
B의 0제곱부터 문자열의 길이 - 1제곱의 값과 위의 문자열의 문자를 숫자로 변환한 값을 뒷자리부터 앞으로 순서대로 곱해준다.
그리고 그 값들을 모두 더하면 10진법 수로 변환이된다.
예제의 경우 B의 0제곱을 Z(35) 와 곱. B의 1제곱을 35와 곱, ... B의 4제곱을 35와 곱하고 이 값들을 모두 더하여 출력한다.
3. 문제 풀이
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int B, index, x, ans = 0;
string N;
cin >> N >> B;
for(int i = 0; i < N.length(); i++) {
index = N.length() - (i + 1);
if(N[index] >= '0' && N[index] <= '9') x = N[index] - '0';
else x = N[index] - 55;
ans += x * pow(B, i);
}
cout << ans;
}
제곱을 계산해주는 함수인 pow() 를 사용하기 위해 cmath 를 include 해준다.
정수형 변수 B, index, x, ans 를 선언하고 ans 를 0으로 초기화한다.
문자열 객체 N 을 생성.
cin 으로 B진법 수와 B의 값을 입력받아 각각 N과 B에 저장한다.
for문으로 i 가 0부터 N의 길이보다 작을 때 1씩 더하며 반복하도록 한다.
index 변수에 i 에 1을 더해 N의 길이에서 뺀 값을 저장한다.
if문으로 N 의 index 번 인덱스의 값이 '0' 값 이상이거나 '9' 값 이하라면 변수 x 에 그 값에서 '0' 을 뺀 값을 저장한다.
그 외의 경우엔 x 에 N 의 index 번 인덱스의 값에서 55를 뺀 값을 저장한다.
x 의 값과 pow 함수로 B 를 i 제곱한 값을 곱해서 ans 의 값에 더해준다.
위의 반복이 끝나면 cout 으로 ans 를 출력한다
4. 성능 확인
5. 마무리
진법 변환을 구현해보았다. 제곱 함수나 진법 변환 방법 등은 잘 알아두자.
'백준 - 단계별로 풀어보기 > 일반 수학 1' 카테고리의 다른 글
[백준] 1193번 : 분수찾기 | C++ (0) | 2023.10.18 |
---|---|
[백준] 2292번 : 벌집 | C++ (0) | 2023.10.18 |
[백준] 2903번 : 중앙 이동 알고리즘 | C++ (0) | 2023.10.18 |
[백준] 2720번 : 세탁소 사장 동혁 | C++ (0) | 2023.10.18 |
[백준] 11005번 : 진법 변환 2 | C++ (0) | 2023.10.13 |