[Algorithme] 진법 변환 2

gunggme·2023년 10월 29일

알고리즘

목록 보기
3/42

진법 변환 2 어떻게 푸나요?

난 처음에 이 문제를 보고 아주 쉬운 문제로 생각했다.. 그이유는 전에 푼 진법 변환문제에서 반대로 하면 될줄 알았지만..? 쉬운건 나였다..

하지만 여러번에 실패를 맞보고 풀게 되었는데 한번 내가 생각한 그대로 순서를 봐보자

알고리즘을 생각한 순서

보면 아주 쉬움

  1. 진법 변환할때 n / b을 하고 나머지를 구하고 더하면 진법이다.
  2. 만약 10보다 작게 나올경우 나머지를 그냥 더한다
  3. 반복문은 n보다 b가 클때까지 1번과 2번을 반복한다.
  4. n이 0이 아닐땐 1번문과 2번을 실행한다.

이 순서를 생각하면 쉽긴하지만..? 이걸 그대로 하게 된다면 아주 많은 오답을 보게 될것이다. 하지만 아스키코드의 성질을 생각해보면 저기서 조금이라도 추가하면 알게 될것인데. 먼저 아스키 코드의 성질을 알아보자

아스키 코드의 성질

  1. int형에다 문자'0'을 더하면 거기에 맞는 문자로 바뀐다 (ex 35 + '0' => "35")
  2. 만약 1에서 한 값이 '9'보다 크면 '0'을빼고 ('A'-10)을 더하면 거기에 맞는 대문자 알파벳이 나온다 (ex (35 + '0') - '0' + 'A' + 10 => 'Z')

이것을 생각하고 푼다면? 아주 쉽게 풀릴것이다.

소스코드

#include<iostream>
#include<string>
#include <algorithm>
#include<cmath>

using namespace std;

int main() {
	int n, n_Num;
	string Temp = "", result = "";
	//tmp != 0 && n_Num > 10
	cin >> n >> n_Num;
	while (true) {
		int tmp = n % n_Num + '0';
		if (('0' <= tmp && tmp <= '9')) {
			Temp += to_string(tmp - '0');
		}
		else { 
			Temp += (char)(tmp - '0' + 'A' - 10);
		}
		//cout << (char)(tmp - '0' + 'A' - 10) << "\n";
		n /= n_Num;
		if (n < n_Num) {
			break;
		}
	}

	if (n != 0) {
		if (n >= 10) {
			Temp += (char)(n + 'A' - 10);
		}
		else {
			Temp += to_string(n);
		}
	}

	for (int i = Temp.length() - 1; i >= 0; i--) {
		result += Temp[i];
	}

	cout << result << "\n";
}
profile
안녕하세요!

0개의 댓글