[BAEKJOON 11005번 : 진법 변환 2]
[문제]

[고찰]
해당 문제를 처음에 접근할 때는, 출력값 'ZZZZZ'에 정신이 팔려 "N - x * B⁰ - x * B¹ - x * B² ⋯의 식을 만족하는 x를 찾은 뒤, x를 아스키코드를 활용해 문제의 조건에 따라 출력하려고 했습니다.
그런데 생각해보니, x의 값이 일정한 것은 예제 입력에서만 그런 것이고, 실제 입력값에서 x는 일정하지 않고, 각 진법의 자리 수마다 모두 다른 값일 수 있기 때문에 이 아이디어는 사용하지 못하였습니다.
그리고 이후에 다른 아이디어는 생각을 하지 못하겠어서 다른 분들의 풀이를 찾았고, 해당 문제에 대한 답변을 정리하고자 합니다.
[개념]
해당 문제에서 쓰는 아이디어는 나머지와 몫을 이용하는 것입니다.
어떤 수 N을 B진법으로 바꾸고 싶을 때는 아래와 같이 표현할 수 있습니다.
N = a₀ × B⁰ + a₁ × B¹ + a₂ × B² + ... + aₖ × Bᵏ
여기서 a₀, a₁, a₂, ..., aₖ 은 진법 변환 후의 각 자릿수입니다
이걸 반대로 생각한다면,
- a₀ = N % B → 가장 낮은 자리 (B⁰)의 숫자
- N = N / B → 다음 자리 계산을 위해 N을 한 자릿수 위로 줄임
- a₁ = N % B → B¹ 자리 숫자
- N = N / B …
- …
이걸 반복하면서 나머지를 계속 저장하면, 자동으로 모든 자리 수의 숫자를 구하는 것이 가능합니다.
예제 입력의 값 60466175를 위의 방식대로 하면 아래와 같습니다.
| 단계 | 나눈 몫 | 나머지 | 진법 자리 (역순) |
| 1 | 1679615 | 35 | Z (B⁰ 자리) |
| 2 | 46656 | 35 | Z (B¹ 자리) |
| 3 | 1296 | 35 | Z (B² 자리) |
| 4 | 36 | 35 | Z (B³ 자리) |
| 5 | 1 | 35 | Z (B⁴ 자리) |
이를 코드로 구현하면 다음과 같습니다.
while (N > 0) {
int remainder = N % B;
if (remainder < 10)
{
result += (char)(remainder + '0');
}
else
{
result += (char)(remainder - 10 + 'A');
}
N /= B;
}
[정리]
이런 아이디어는 경험에서 나오는 것 같습니다.
지금까지 브론즈의 문제들을 풀어왔는데, 하루 정도만 더 브론즈 문제를 풀고,
앞으로는 실버 문제를 풀면서 더 넓은 폭의 문제를 풀어야겠습니다.
[Solution]
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int N, B;
cin >> N >> B;
string result = "";
while (N > 0)
{
int remainder = N % B;
if (remainder < 10)
{
result += (char)(remainder + '0');
} else
{
result += (char)(remainder - 10 + 'A');
}
N /= B;
}
if (result.empty())
result = "0";
reverse(result.begin(), result.end());
cout << result;
return 0;
}'코딩 테스트' 카테고리의 다른 글
| [코딩테스트 31일차] BAEKJOON 1316번 : 그룹 단어 체커 (1) | 2025.06.19 |
|---|---|
| [코딩테스트 30일차] BAEKJOON 1032번 : 명령 프롬프트, 9093번 : 단어 뒤집기 (0) | 2025.06.17 |
| [코딩테스트 28일차] BAEKJOON 2748번 : 피보나치 수 2, BAEKJOON 10989번 : 수 정렬하기 3 (0) | 2025.06.13 |
| [코딩테스트 27일차] BAEKJOON 11050번 : 이항 계수 1, 10798번 : 세로읽기 (0) | 2025.06.10 |
| [코딩테스트 26일차] BAEKJOON 2309번 : 일곱 난쟁이 (0) | 2025.06.09 |