진법 변환을 한다는 것은 2진법은 2로, 8진법은 8로 지정된 숫자를 계속 나눈다는 것이다.
정답
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inputArray = br.readLine().split(" ");
int N = Integer.parseInt(inputArray[0]);
int B = Integer.parseInt(inputArray[1]);
StringBuilder sb = new StringBuilder();
while(N > 0) {
if (N % B < 10) {
sb.append((char) (N % B + '0'));
}
else{
sb.append((char) (N % B - 10 + 'A'));
}
N /= B;
}
System.out.println(sb.reverse().toString());
}
}
N과 B를 입력받아서 N을 B로 나누는 과정을 N이 0보다 클 때까지 반복한다.
결과
한 3번 틀리고 답 보고 이해했다.
맨 처음에 했던 생각은 36개 길이의 배열을 만들어서 초기화를 한 다음에 B랑 매칭되는 배열값을 StringBuilder에 추가하면 되지 않을까였다.
// while(N > 0) {
// sb.append(arr[B - 1]);
// N /= B;
// }
while(N > 0) {
if (N % B < 10) {
sb.append(arr[N - 1]);
}
else{
sb.append(arr[N - 1]);
}
N /= B;
}
둘 다 당연히 안된다.
일단 N / B가 36보다 크면 index 범위 예외 발생하고,
애초에 B진법이라고 해서 항상 B가 나올까? 도 아니지.
2진법은 2가 항상 나와서가 아니라 0과 1, 2개로 표현가능해서 2진법이니까.
결국 N % B한 값에 char 형변환을 써서 '0' 또는 'A' 더해서 처리하는 것이다.
결과적으로 배열도 필요없고 그냥
StringBuilder를 reverse()하거나 list를 뒤에서부터 출력하면 된다. (2진법하듯이 2로 계속 나누어 계산해보면 결과값이 반대로 나오거든)