[백준/C++]#2745 - 진법 변환
2021. 1. 26. 11:03ㆍ필요/코딩테스트(백준)
풀이
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
int b, sum = 0;
cin >> s >> b;
for (int i=0; i<s.size(); i++) { // 문자열 크기만큼 반복
if (s[i] >= '0' && s[i] <= '9') { // 수가 문자가 아닌 경우
sum = sum*b + (s[i] - 48); // 문자 0 의 아스키코드 : 48
}
else
sum = sum*b + (s[i] - 65 + 10); // 문자 A 의 아스키코드 : 65
}
cout << sum;
return 0;
}
개념
이번에는 특정 진법의 수를 10진수로 변환하는 문제이다.
다음 그림은 3진법 102를 십진수 11로 변환한 예이다.
다른 진법들도 마찬가지로 계산가능하다.
풀이
지난번의 문제를 통해, string 라이브러리를 사용해 문자열을 받으면 문자->숫자로 변경이 용이하다는 것을 알고있다.
각 자릿수 계산의 합으로 십진수를 나타낼 수 있으므로 for문은 s의 size만큼 반복한다.
그리고 sum은 다음과 같이 구한다.
이전에 구한 전체 값에 3을 곱하고, 새롭게 들어오는 값을 더한다.
문자는 계산을 위해 숫자로 바꿔줘야하는데, 0~9와 A~Z의 아스키코드 위치가 다르다.
따라서 if문을 사용해 구분하고, 각 문자에 해당하는 아스키코드를 뺀다.
+a
아스키코드표를 보면서 문제를 해결했는데, 좀 더 편한 솔루션이 있다.
for (int i=0; i<s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
sum = sum*b + (s[i] - '0');
}
else
sum = sum*b + (s[i] - 'A' + 10);
}
이런 풀이도 가능하다.
'필요 > 코딩테스트(백준)' 카테고리의 다른 글
[백준/C++]#10814 - 나이순 정렬 (0) | 2021.01.28 |
---|---|
[백준/C++]#11650 - 좌표 정렬하기 (0) | 2021.01.27 |
[백준/C++]#11005 - 진법 변환2 (0) | 2021.01.25 |
[백준/C++]#9613 - GCD 합 (0) | 2021.01.24 |
[백준/C++]#2609 - 최대공약수와 최소공배수 (0) | 2021.01.23 |