[작성일: 2023. 09. 18]
https://www.acmicpc.net/problem/11005
풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int b = sc.nextInt();
System.out.println(Integer.toString(n, b).toUpperCase());
}
}
Integer.valueOf 메서드는 문자열을 정수로 변환하는데 사용하지만 특정 진법에 따라 문자열을 정수로 변환할 수도 있다.
이럴 때는 Integer.toString 메서드를 사용하면 된다고 한다.
근데 그렇게만 출력하면 소문자로 출력되기 때문에 toUpperCase()를 사용해 대문자로 변환했다.
하지만 이렇게 java의 라이브러리를 사용하는 것이 아닌 방법도 있다기에 공부할 겸 문제를 다시 풀었다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int b = sc.nextInt();
StringBuilder sb = new StringBuilder();
while (n > 0) {
int a = n % b;
if (a < 10) {
sb.append(a);
} else {
sb.append((char)(a + 'A' - 10));
}
n /= b;
}
System.out.println(sb.reverse());
}
}
n%b는 숫자 n을 b로 나누었을 때의 나머지를 반환한다. 이 나머지 값은 n을 b진법으로 변환했을 때 가장 낮은 자리값이 된다.
13을 2진법으로 변환한다고 생각했을 때,
13 / 2 = 6 -> 나머지 값 1
6 / 2 = 3 -> 나머지 값 0
3 / 2 = 1 -> 나머지 값 1
1 / 2 = 0 -> 나머지 값 1
나머지 값을 아래에서부터 위로 읽으면 13의 2진법 표현은 1101이 된다. (이렇게 반대로 출력하기 위해 reverse() 메서드를 사용했다.)
나머지 값이 10 이상일 때는 10진법의 표현을 넘어서기 때문에 알파벳으로 변환해야 한다.
a - 10 을 한 이유는 나머지 값이 10부터 시작하기 때문이다. 나머지가 10이면 값은 0이 되고, 나머지가 11이면 이 값은 1이 된다.
'A'를 더한 이유는 아스키 코드 값으로 65를 갖기 때문에 a-10에 'A'를 더하면 원하는 알파벳의 아스키코드 값을 얻을 수 있다.
여기까지 계산하면 최종 계산값은 int형이기 때문에 char형으로 형변환하여 알파벳 문자를 얻는다.
a - 11 = 1 + 'A' = 66
(char)66 = B