본문 바로가기

알고리즘 & 코딩테스트/알고리즘 공부

진법 변환 (Base Conversion)

진법이란 무엇일까요?
진법이란 수를 표기하는 기수법의 하나로 몇 개의 기본 숫자를 이용하여 수를 표시하는 방법이다.
자리값이 올라감에 따라 수가 일정하게 커지는 규칙을 이용하고 수를 표시한다. 아라비아 숫자에 해당하는 1~9까지의 숫자를 사용하여 수를 나타내는 방식을 10진법이라고 하고 프로그래밍 영역에서는 2진법,  8진법, 16진법이 존재한다.

모든 진법은 숫자의 위치에 따라 가중치가 달라진다. 아래 그림을 보자.

모든 진법상 위치의 가중치

예를들어 `12345 = (1 \times 10^4)+(2 \times 10^3)+(3 \times 10^2)+(4 \times 10^1)+(5 \times 10^0)`와 같은것이다.

주의깊게 봐야하는 부분은 각 진법간의 변환인데, 차례대로 알아보자.
10진수를 `N`진수로 변환하는 방식을 알아보자.

10진수를 N진수로 변환

바꾸고 싶은 진수의 숫자로 더 이상 나눌 수 없을 때까지 나눈 뒤 역순으로 읽으면 된다. 
그렇다면 반대로 `N`진수를 10진수로 바꾸는 방법은 무엇일까?

N진수를 10진수로 변환

가장 위에서 보았던 위치의 가중치를 지수로 하여 해당 진법의 거듭제곱으로 각 위치에 해당하는 숫자를 곱해서 더해주면 된다. 파이썬에서는 위에서 언급한 2진수, 8진수, 16진수, 10진수는 내장함수로 구현되어 있으나 타 진법에 대해서는 구현되어있지 않다. 그러므로 직접 함수를 구현해야 한다.

# 10진수 -> n진수
def convert_notation(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base)

    return convert_notation(q, base) + T[r] if q else T[r]
# n진수 -> 10진수
def convert_to_decimal(n, base):
    decimal = 0
    for idx, val in enumerate(str(n)[::-1]):
        decimal += (base ** idx) * int(val)
        
    return decimal
# 10진수
int()

# 2진수
bin()

# 8진수
oct()

# 16진수
hex()