기록의 정석

개발/기타

[Python/파이썬] 진법 변환

sakjung 2020. 12. 29. 15:22

1. 다른 진법 (2 ~ 10 진법)의 숫자를 10진수로 변환

# 2 <= base <= 10

def convert_to_decimal(number, base):

    multiplier = 1
    result = 0
    
    while 0 < number:
    	result += number % 10 * multiplier
        multiplier *= base
        number = number // 10
    
    return result

위 함수는 while loop에서 number % 10를 통해 1의 자리 숫자를 하나씩 가져온 후 multiplier를 곱해 10 진수로 변환하는 함수 이다. 한번의 1의 자리 계산 후에는 반복문의 다음 계산을 위해 multiplier를 base 만큼 곱한 값으로 갱신해주고 number를 10 (10진수 base)으로 나눠서 그 다음 1의 자릿수를 준비해준다.

2. 10진수를 다른 진법 (2 ~ 10 진법)으로 변환

# 2 <= base <= 10

def convert_from_decimal(number, base):	

    multiplier = 1
    result = 0
    
    while 0 < number:
    	result += number % base * multiplier
        multiplier *= 10
        number = number // base
	
    return result

1번 함수와 같은 논리로 10진수를 다른 진법으로 변환할 수 있다. base (진법)에 따른 1의 자릿수를 통해 변환한다.

3. 10진수를 다른 진법 (20 진법 이하)으로 변환

# 2 <= base <= 20

def convert_from_decimal_to_larger_bases(number, base):

    strings = "0123456789ABCDEFGHIJ"
    result = ""
    
    while 0 < number:
    	digit = number % base
        result = strings[digit] + result
        number = number // base
	
    return result

base가 10보다 큰 경우 10 이상의 숫자를 나타내기 위해 문자 (strings)가 필요하다. 즉, strings에서 A는 10, B는 11, J는 19이다. 이외에는 마찬가지로 base에 따른 1의 자릿수를 구한 후 그에 상응하는 문자열을 반복해서 덧붙여 나가는 식이다.

4. 10진수를 다른 진법으로 변환 (재귀 버젼)

def convert_from_decimal_recursion(number, base):
	
    strings = "0123456789ABCDEF"
    
    if number < base:
    	return strings[number]
	
    else:
    	return convert_from_decimal_recursion(number // base, base) + strings[number % base]

재귀함수를 활용해서 10진수를 다른 진법으로 변환하는 함수이다. 로직은 3번 함수와 같지만 재귀 함수가 사용 되었기 때문에 코드가 더 간결해 졌다. number가 base보다 작지 않다면 계속해서 함수를 재귀적으로 실행한 결과를 왼편에 덧붙이면서 10진수를 다른 진법으로 변환하는 원리이다. 즉, 하나의 재귀 루프에서 오른편에는 현재 1의 자리 숫자에 상응하는 문자, 왼편에는 다음 1의 자리 계산을 통해 오게 될 재귀함수 결과 문자가 붙게 되는 식으로 진행된다.

 

Reference: 파이썬 자료구조와 알고리즘 (Mia Stein, 2019)

'개발 > 기타' 카테고리의 다른 글

System.in과 System.out에 대한 테스트  (1) 2021.02.13