본문 바로가기

알고리즘

[알고리즘] 진법 변환 (Java)

728x90

진법이란?

진법은 숫자를 표현하는 체계로, 특정 숫자를 구성하는 각 자릿수의 가치를 나타내는 방법입니다. 우리가 일상적으로 사용하는 10진법은 0부터 9까지의 숫자를 사용하며, 각 자리의 위치에 따라 값이 10의 제곱으로 증가합니다.

예를 들어, 숫자 2901을 생각해보면:

  • 1000의 자리: 2 × 1000 = 2000
  • 100의 자리: 9 × 100 = 900
  • 10의 자리: 0 × 10 = 0
  • 1의 자리: 1 × 1 = 1

이들을 모두 더하면 2901이 됩니다. 다른 진법도 비슷한 방식으로 숫자의 값을 계산합니다.

10진법 -> 2진법 변환

2진법은 01 두 개의 숫자만을 사용합니다. 10진수를 2진수로 변환하는 방법은 매우 간단합니다: 주어진 수를 2로 나누고 나머지를 기록한 다음, 이 나머지를 역순으로 읽으면 됩니다.

public class Main {
    public static void main(String[] args){
        
        // 10진수 (예: 11)
        int number = 11;
        
        // 2진수로 변환
        // 수가 0이 될 때까지 2로 나누고, 나머지를 저장한 후 0이 되었을 때 역순으로 읽는다.
        StringBuilder sb = new StringBuilder();
        while (number > 0) {
            sb.append(number % 2);  // 2로 나눈 나머지 저장
            number /= 2;  // 몫을 다시 number로 설정
        }
        System.out.println(sb.reverse());  // 역순으로 출력
    }
}

실행 결과:
11을 2진수로 변환하면 1011이 됩니다.

10진법 -> 3진법 변환

3진법에서는 0, 1, 2 세 가지 숫자를 사용합니다. 10진수를 3진수로 변환하는 방법은 2진법과 비슷합니다. 주어진 수를 3으로 나누고 나머지를 기록한 후, 이 나머지를 역순으로 읽습니다.

public class Main {
    public static void main(String[] args){
        
        // 10진수 (예: 11)
        int number = 11;
        
        // 3진수로 변환
        // 수가 0이 될 때까지 3으로 나누고, 나머지를 저장한 후 0이 되었을 때 역순으로 읽는다.
        StringBuilder sb = new StringBuilder();
        while (number > 0) {
            sb.append(number % 3);  // 3으로 나눈 나머지 저장
            number /= 3;  // 몫을 다시 number로 설정
        }
        System.out.println(sb.reverse());  // 역순으로 출력
    }
}

실행 결과:
11을 3진수로 변환하면 102가 됩니다.

10진법 -> N진법 변환 

10 이상의 숫자를 A, B, C 등의 알파벳으로 표현해야 합니다.

아래 코드는 10진수를 임의의 N진법으로 변환하는 방법을 보여줍니다.

public class Main {
    public static void main(String[] args) {
        // 10진수 (예: 925)
        int number = 925;
        
        // 변환할 진법 (예: 16진법)
        int base = 16;
        
        System.out.println(convertToBase(base, number));  // 올바른 출력: 39D
    }
    
    // base: 진법, number: 10진수
    public static String convertToBase(int base, int number) {
        StringBuilder sb = new StringBuilder();
        
        // 10~15를 표현하기 위한 문자들
        String hexDigits = "ABCDEF";
        
        // 10진수인 경우 그대로 반환
        if (base == 10) {
            return String.valueOf(number);
        }
        
        // N진법으로 변환
        while (number > 0) {
            int remainder = number % base;
            
            // 10 이상이면 알파벳으로 변환
            if (remainder >= 10) {
                sb.append(hexDigits.charAt(remainder - 10));
            } else {
                sb.append(remainder);
            }
            number /= base;  // 몫을 다시 number로 설정
        }
        
        // 결과 문자열을 역순으로 반환
        return sb.reverse().toString();
    }
}

실행 결과:
925를 16진수로 변환하면 39D가 됩니다.

2진법 -> 10진법 변환

이제 2진수를 10진수로 변환하는 방법을 살펴보겠습니다. 각 자릿수를 읽어가면서, 해당 자릿수의 가중치(2의 제곱)를 곱하여 더해주면 됩니다.

public class Main {
    public static void main(String[] args){
        
        // 2진수 문자열 (예: "1011")
        String binaryNumber = "1011";
        
        int decimalResult = 0;
        int baseMultiplier = 1;  // 각 자릿수에 해당하는 가중치 (2의 제곱수)
        
        // 2진수 문자열을 뒤에서부터 읽으며 10진수로 변환
        for (int i = binaryNumber.length() - 1; i >= 0; i--) {
            decimalResult += (binaryNumber.charAt(i) - '0') * baseMultiplier;
            baseMultiplier *= 2;  // 다음 자리의 가중치는 2배
        }
        System.out.println(decimalResult);  // 출력: 11
    }
}

실행 결과:
1011을 10진수로 변환하면 11이 됩니다.

N진법 -> 10진법 변환

N진수를 10진수로 변환할 때도 2진법과 동일한 원리를 적용할 수 있습니다. 각 자릿수를 읽어가며 해당 진법의 제곱수를 곱하고, 모든 값을 더해줍니다.

public class Main {
    public static void main(String[] args){
        
        // N진수 문자열 (예: "39D")
        String baseNumber = "39D";
        int base = 16;
        
        int decimalResult = 0;
        int baseMultiplier = 1;  // 각 자릿수에 해당하는 가중치 (base의 제곱수)
        
        // N진수 문자열을 뒤에서부터 읽으며 10진수로 변환
        for (int i = baseNumber.length() - 1; i >= 0; i--) {
            char c = baseNumber.charAt(i);
            
            // A~F 문자 처리
            if (c >= 'A' && c <= 'F') {
                decimalResult += (c - 'A' + 10) * baseMultiplier;
            } else {
                decimalResult += (c - '0') * baseMultiplier;
            }
            baseMultiplier *= base;  // 다음 자리의 가중치는 base배
        }
        System.out.println(decimalResult);  // 출력: 925
    }
}

실행 결과:
39D를 10진수로 변환하면 925가 됩니다.

728x90