자료구조 & 알고리즘(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
반응형