https://www.acmicpc.net/problem/11005
문제
> 10진법 수 N이 주어진다.
> 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.
> 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다.
> 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
접근
어떤 수를 B진법으로 바꾸기 위해선 몫이 0이 될 때까지 나눈 나머지를 쭉 나열한 후 역순으로 뒤집었을 때 변환된다.
예를들어 37을 2진법으로 바꾸면 2로 쭉 나누었을 때, 1101001이 나오고 이를 뒤집어 1001011이 37이 된다.
입력으로 들어온 N을 B로 계속 나누며 나머지를 배열에 저장 한 뒤 역순으로 꺼내오면서 10보다 큰 수는 10을 빼고 A를 더해 문자로 변환해준다.
문제해결
> N과 B를 입력받고 변환에 쓸 나머지를 저장할 동적배열 num을 선언한다.
> 몫이 0이 될 때까지 N을 몫으로 갱신하며 B로 나누며 나머지를 num에 저장한다.
> num을 역순으로 가져오며 10보다 작으면 문자0을 더해주고 문자로 캐스팅 연산하여 변환해준다.
> 더 크면 해당 값에서 10을 빼고 A를 더해 알파벳을 변환해준다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main
{
//11005번 진법 변환2
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
ArrayList<Integer> num = new ArrayList<>();
while(N > 0)
{
num.add(N % B);
N /= B;
}
StringBuilder sb = new StringBuilder();
for(int i = num.size()-1; i >= 0; i--)
{
if(num.get(i) < 10)
{
sb.append((char)('0'+ num.get(i)));
continue;
}
sb.append((char)('A' + (num.get(i)- 10)));
}
System.out.print(sb);
}
}

후기
진법 변환은 문제없었는데 뒤에 10 이상의 수를 문자로 처리해주는게 까다로웠다.
그냥 캐스팅 해주면 만약 3을 변환하면 3에 해당하는 아스키 코드 3에 해당하는 문자가 나온다. 따라서 0을더해 숫자 3에 해당하는 아스키 값으로 바꿔 준 뒤 캐스팅해줘야한다.
알파벳도 마찬가지이다.