자료구조 & 알고리즘(Data Structure & Algorithm)/알고리즘(Algorithm)
[Algorithm] 10진수를 n진수로, n진수를 10진수로 변환하기 (진법 변환) - Java
잇트루
2024. 1. 16. 01:30
반응형
자바의 진법 변환
진법 변환은 알고리즘 문제에서 자주 활용된다. 자바에서는 이를 쉽게 활용할 수 있도록 함수를 제공하고 있다.
자바에서 제공하는 함수를 통해 진법을 변환하는 방법과 직접 구현하여 변환하는 방법을 알아보고자 한다.
10진수를 N진수로 변환하기
자바 내장 함수 사용
- 10진수의 숫자를 N진수로 변환하기 위해 java.lang 패키지에서 Integer와 Long 클래스의 toString() 메서드를 제공한다.
- 첫 번째 인자에는 변환할 수, 두 번째 인자에는 변환할 진법을 넣어 쉽게 변환할 수 있다.
- 이 외에도 java.math 패키지의 BigInteger 클래스의 toString() 메서드를 통해 진법 변환을 할 수도 있다.
public class Main {
public static void main(String[] args) {
int decimal = 1234;
String binary = Integer.toString(decimal, 2);
String base4 = Integer.toString(decimal, 4);
String octal = Integer.toString(decimal, 8);
String hexa = Integer.toString(decimal, 16);
String base32 = Integer.toString(decimal, 32);
System.out.println(binary);
System.out.println(base4);
System.out.println(octal);
System.out.println(hexa);
System.out.println(base32);
}
}
// 출력
10011010010
103102
2322
4d2
16i
직접 구현
직접 구현하는 방법에는 다음과 같이 수행할 수 있다.
- 10진수 숫자를 변환할 진법으로 나눈 나머지를 구한다.
- 나머지를 해당 진수의 자릿수로 사용한다.
- 10진수 이상인 경우 나머지가 10 이상인 경우 'a'부터 대응되는 문자로 변환한 후 지수의 자릿수로 사용한다.
- 위 과정을 10진수 숫자가 0이 될 때까지 반복한다.
- 완성된 수를 역순으로 뒤집는다.
public class Main {
public static void main(String[] args) {
int decimal = 1234;
String binary = convertDecimalToBase(decimal, 2);
String base4 = convertDecimalToBase(decimal, 4);
String octal = convertDecimalToBase(decimal, 8);
String hexa = convertDecimalToBase(decimal, 16);
String base32 = convertDecimalToBase(decimal, 32);
System.out.println(binary);
System.out.println(base4);
System.out.println(octal);
System.out.println(hexa);
System.out.println(base32);
}
private static String convertDecimalToBase(int decimal, int base) {
StringBuilder sb = new StringBuilder();
// 10진수 정수가 0이 될 때까지 반복
while (decimal > 0) {
// 10진수 정수를 base로 나눈 나머지(n진법으로 변환된 수)
int temp = decimal % base;
if (temp >= 10) { // 나머지 값이 10 이상이면, 'a'부터 시작하는 문자로 변환
sb.append((char) (temp - 10 + 'a'));
} else { // 나머지 값이 10 미만이면 그대로 사용
sb.append(temp);
}
// 다음 숫자를 구하기 위한 나눗셈
decimal = decimal / base;
}
// 문자열 뒤집기
return sb.reverse().toString();
}
}
// 출력
10011010010
103102
2322
4d2
16i
N진수를 10진수로 변환하기
자바 내장 함수 사용
- N진수의 숫자를 10진수로 변환하는 방법은 java.lang 패키지에서 Integer와 Long 클래스의 parseInt() 메서드를 사용한다.
- 첫 번째 인자에는 변환할 문자열, 두 번째 인자에는 변환할 문자열의 진법을 넣어 10진수로 변환할 수 있다.
- 이 외에도 java.math 패키지의 BigInteger 클래스의 생성자를 통해 진법 변환을 할 수도 있다.
public class Main {
public static void main(String[] args) {
int binaryToDecimal = Integer.parseInt("1010110101", 2);
int base4ToDecimal = Integer.parseInt("2101201101", 4);
int octalToDecimal = Integer.parseInt("54210", 6);
int hexaToDecimal = Integer.parseInt("12132", 8);
int base32ToDecimal = Integer.parseInt("abcde", 16);
System.out.println(binaryToDecimal);
System.out.println(base4ToDecimal);
System.out.println(octalToDecimal);
System.out.println(hexaToDecimal);
System.out.println(base32ToDecimal);
}
}
// 출력
693
596049
7422
5210
703710
직접 구현
직접 구현하는 방법에는 다음과 같이 수행할 수 있다.
- 거듭제곱을 위한 수와 결과를 담을 변수를 준비한다.
- 변환할 문자열의 각 자릿수를 역순으로 순회한다
- 각 자릿수가 '0'과 '9' 사이에 포함되면 해당 숫자로 변환하고, 그보다 크면 대응하는 알파벳으로 변환한다.
- 거듭제곱 수와 변환한 수를 곱하여 결과에 더한다.
- 거듭제곱 수를 문자열의 진법과 곱하여 업데이트한다.
public class Main {
public static void main(String[] args) {
int binaryToDecimal = convertBaseToDecimal("1010110101", 2);
int base4ToDecimal = convertBaseToDecimal("2101201101", 4);
int octalToDecimal = convertBaseToDecimal("54210", 6);
int hexaToDecimal = convertBaseToDecimal("12132", 8);
int base32ToDecimal = convertBaseToDecimal("abcde", 16);
System.out.println(binaryToDecimal);
System.out.println(base4ToDecimal);
System.out.println(octalToDecimal);
System.out.println(hexaToDecimal);
System.out.println(base32ToDecimal);
}
private static int convertBaseToDecimal(String num, int base) {
int decimal = 0;
int power = 1; // 거듭제곱을 위한 변수
// 문자열을 역순으로 순회
for (int i = num.length() - 1; i >= 0; i--) {
int digit; // 현재 자릿수의 숫자
char curr = num.charAt(i); // 현재 자리의 문자
if (curr >= '0' && curr <= '9') { // 현재 문자가 숫자라면 해당 숫자로 변환
digit = curr - '0';
} else { // 알파벳 문자(A ~ F)이면 10 ~ 15의 값으로 변환
digit = curr + 10 - 'A';
}
// 현재 자릿수의 숫자 거듭제곱수를 곱하여 10진수에 더함
decimal += digit * power;
// 거듭제곱수를 업데이트
power *= base;
}
return decimal;
}
}
693
596049
7422
5210
2940670
반응형