[P&B] #65 BAEKJOON 11005
백준 11005번 진법 변환 2
문제 설명
10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.
출력
첫째 줄에 10진법 수 N을 B진법으로 출력한다.
나의 문제 풀이 코드
import java.util.*;
import java.io.*;
public class bj11005 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
StringBuilder result = factorization(N,B);
bw.write(result.toString());
bw.flush();
}
//재귀함수 생성 어려워..
private static StringBuilder factorization(int N, int B) {
int div = N/B;
int num = N%B;
StringBuilder sb = new StringBuilder();
if (div > 0)
sb.append(factorization(div, B));
String str = changeStr(num);
sb.append(str);
return sb;
}
private static String changeStr(int num){
String s = "";
if(num>=10&&num<=35){
s += (char)(num+55);
}
else
s = String.valueOf(num);
return s;
}
}
문제 풀이 코멘트
이 코드에서는 재귀 함수를 사용하는 것이 관건이었습니다. 코드를 이해하기 위해 재귀 함수와 관련된 이론적인 설명부터 기록하겠습니다.
재귀 함수 (Recursive Function)란 함수가 자기 자신을 호출하는 특징을 가진 함수를 의미합니다. 재귀 함수는 일반적으로 다음과 같은 구조를 가집니다:
- 베이스 케이스 (Base Case): 재귀 함수가 무한히 호출되지 않도록 멈추는 조건을 정의합니다. 이 조건이 만족되면 재귀 호출이 종료됩니다.
- 재귀 호출 (Recursive Call): 재귀 함수 내에서 자기 자신을 호출하는 부분입니다. 이 부분에서 함수가 새로운 인자값과 함께 다시 호출됩니다.
위의 코드에서 factorization 함수는 재귀 함수입니다. 이 함수는 주어진 숫자 N을 진법 B로 변환한 결과를 StringBuilder 객체로 반환합니다.
div이 0보다 크다면, 즉, 변환할 숫자가 아직 남았다면 재귀 호출을 수행합니다.
- 재귀 호출 시 div를 새로운 숫자로 전달하고, 같은 진법 B를 유지합니다.
- 이렇게 하면 div를 계속해서 나누어 변환한 결과를 얻을 수 있습니다.
- 예를 들어, 43을 2진법으로 변환한다면 101011이 됩니다. 여기서 div는 21, 10, 5, 2, 1, 0 순으로 계산됩니다.
changeStr 함수를 호출하여 현재 숫자 num을 진법에 맞게 문자열로 변환하고, 결과를 StringBuilder에 추가합니다.
- changeStr 함수는 10 이상의 숫자부터 35까지의 숫자를 알파벳으로 변환하는 함수입니다.
재귀 호출에서 반환한 결과와 현재 변환한 결과를 합친 후 StringBuilder로 반환합니다.
이렇게 재귀 함수를 사용하여 주어진 숫자를 지정된 진법으로 변환하면, 결과를 구하기 위해 여러 번의 재귀 호출이 발생할 수 있습니다. 재귀 함수는 주어진 문제를 더 작은 하위 문제로 분할하여 해결하고, 이를 결합하여 전체 문제를 해결하는데 사용됩니다.