[백준/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);
		}

이런 풀이도 가능하다.