1. 문제 상세
https://www.acmicpc.net/problem/11005
2. 문제 접근
문제 2745번 : 진법 변환 의 반대이다.
이번에는 10진법 숫자와 진법을 입력받아 해당 진법으로 바꿔 출력한다.
예시로 60466175 를 36진법으로 변환하는 방법을 알아보자.
36진법은 한 자리에 0~35까지의 숫자를 사용한다. 9가 넘어가는 숫자는 10 : A, 11 : B, 12 : C 와 같이 알파벳 대문자로 나타낸다.
변환시, 60466175를 36으로 나눈다. 나눈 나머지를 변환 할 36진법 수 맨 뒷자리로 한다.
나머지 값이 35인데, 35는 Z 로 표시하여 마지막 자리는 Z 가 된다.
이렇게 나눈 몫을 다시 36으로 나눈 나머지를 그 앞 자리로 하고, 다시 나누고 자리수를 표시하기를 몫이 36미만이 될 때 까지 반복, 36 미만이 되면 그 수를 첫 번째 자리로 한다.
즉 10진법 수 X 가 있고, B진법으로 변환할때.X 를 B 로 나눈 나머지가 마지막 자리, 그 몫을 또 B 로 나눈 나머지가 뒤에서 2번째 자리, 이렇게 몫이 B 보다 작아질 때 까지반복하고, 몫이 B 보다 작아지면 그 수를 첫 번째 자리로 한다.
이 문제를 해결하기 위해서는 입력받은 10진법 수를 B 로 나누며 그 몫이 B 보다 작아질 때 까지 반복한다.
반복에서는 나머지를 문자로 변환, 0~9 는 '0' 값을 더해 문자 '0'~'9'로 그 이상의 수 10~35는 'A'~'Z' 로 표시하기 위해 55를 더해준다.
몫이 B 보다 작아지면 그 값을 문자로 변환하여 문자열에 추가한다.
그리고 이 문자들을 문자열에 하나씩 추가, 반복이 끝나면 문자열을 거꾸로 출력한다.
3. 문제 풀이
#include <iostream>
#include <algorithm>
using namespace std;
int main () {
int x, B;
string N;
cin >> x >> B;
while(x != 0) {
if((x % B) >= 0 && (x % B) <= 9) N += (x % B) + '0';
else N += (x % B) + 55;
x /= B;
}
reverse(N.begin(), N.end());
cout << N;
}
정수형 변수 x, B 를 선언하고 문자열 객체 N 을 생성한다.
cin 으로 10진법 수와 진법을 입력받아 각각 x, B 에 저장한다.
while문으로 x 가 0이 아닐 때 반복하도록 한다.
반복에서는 if문으로 x 를 B 로 나눈 나머지 값이 0 이상 9 이하 일때 N 문자열에 x 를 B 로 나눈 나머지 값에 '0' 을 더한 값을 아스키코드로 하여 문자를 추가한다.
만약 그 외의 경우, N 문자열에 x 를 B 로 나눈 나머지 값에 55를 더한 값을 아스키코드로 하여 문자를 추가한다.
x 에 x 를 B 로 나눈 값을 저장한다.
반복이 끝나면 reverse() 함수에 문자열 N 의 begin() 함수와 end() 함수 값을 전달하여 문자열 전체를 뒤집는다.
이를 cout 으로 출력한다.
4. 성능 확인
5. 마무리
이번에는 10진법 -> B 진법 변환을 알아보았다.
'백준 - 단계별로 풀어보기 > 일반 수학 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 |
[백준] 2745번 : 진법 변환 | C++ (0) | 2023.10.13 |