곰퓨타의 SW 이야기

[python] 진수변환 뿌시기 🔥 본문

TIL/코테개념_python

[python] 진수변환 뿌시기 🔥

곰퓨타 2021. 1. 3. 17:28

문제들을 해결하면서 bin 함수와 int함수를 적절하게 섞어서 2진수와 10진수의 변환을 자유롭게 할 수 있다는 것은 알 수 있었지만..

그 외의 진수변환을 위해서라도 진수변환 코드를 알아두면 유용하게 사용할 수 있을 것 같아서 작성해보게 되었다.

 

1. bin과 int를 통한 10진수 <=> 2진수 변환

n=11
bin_n = bin(n)
dec_n = int(bin_n,base=2)
print("n : %d,  2진수 n : %s,   10진수 n : %d" %(n,bin_n, dec_n))

#n : 11,  2진수 n : 0b1011,   10진수 n : 11

 

 

2. 진수변환 코딩~!

우선 진수변환에 앞서, 파이썬 내장 모듈인 divmod(a,b)를 활용하였다.

이는 두 개의 숫자 a,b를 입력 받아 몫과 나머지를 튜플 형태로 돌려준다.

>>>divmod(7,3)
(2,1)    #(7//3, 7%4)

 

이 코드를 모듈을 활용하여 반복문 버전과 재귀법 버전으로 두 가지 작성하였다.

 

2-1 반복문 버전

10진수보다 오버하여 16진수까지 가는 경우, 10~15의 숫자는 ABCDEF로 변형되므로, 이 경우를 대비한 convertString을 정의해주었다.

 

반복문을 통해 하나하나 나머지를 더해주고 마지막의 몫을 더해줄 것이므로 이를 저장할 문자열 sol을 정의하였다.

a가 b보다 작을 경우 더이상 나눌 수 없으므로 a를 convertString으로 변환하여 리턴해주었고,

a가 b와 같거나 클 경우, divmod를 통해 sol에 나머지를 더해주고, a를 b로 나누었다.

이는 a가 b보다 작아질때까지 반복하도록 while 조건문에 넣어주었다.

 

마지막으로 마지막 몫을 sol에 추가해주고, 이는 손으로 계산하였을 때 거꾸로 올라가므로(ppt)

11을 2진수로 나타내는 방법_직접 그려서 조금 삐뚤 빼뚤하다..ㅎㅎ..

sol[::-1]을 통해 문자열을 뒤집어주어 return 하였다.

# 반복문 버전
def jinsu(a,b):
    convertString="0123456789ABCDEF"
    sol=''
    if a<b :
        return convertString[a]
    while a>=b:
        n=divmod(a,b)
        a //= b
        sol += convertString[n[1]]
    sol += convertString[n[0]]
    return sol[::-1]

 

 

 

2-2 재귀법 버전

이 또한 10진수보다 오버하여 16진수까지 가는 경우, 10~15의 숫자는 ABCDEF로 변형되므로, 이 경우를 대비한 convertString을 정의해주었다.

 

a가 b보다 작을 경우 더이상 나눌 수 없으므로 a를 convertString으로 변환하여 리턴해주었다.

그렇지 않은 경우, divmod로 몫과 나머지를 n에 저장하고

jinsu_rec(a//b,b)를 호출하여 a를 b로 나눈 수를 재귀로 실행하고 뒤에 나머지인 n[1]을 convert하여 더해주었다.

 

이는 순서에 유의해야하는데 jinsu_rec을 통해 끝까지 내려가서 그 경우의 수를 가장 앞에 붙여주면 실행 순서와 뒤집어지게 되어 반복문에서 s[::-1]과 같은 효과를 얻을 수 있다는 점을 유의해야 한다 ❗️

# 재귀법 버전
def jinsu_rec(a,b):
    convertString="0123456789ABCDEF"
    if a <b :
        return convertString[a]
    n = divmod(a,b)
    return jinsu_rec(a//b, b)+ convertString[n[1]]

 

 

 

2-3 최종 코드

# 반복문 버전
def jinsu(a,b):
    convertString="0123456789ABCDEF"
    sol=''
    if a<b :
        return convertString[a]
    while a>=b:
        n=divmod(a,b)
        a //= b
        sol += convertString[n[1]]
    sol += convertString[n[0]]
    return sol[::-1]

# 재귀법 버전
def jinsu_rec(a,b):
    convertString="0123456789ABCDEF"
    if a <b :
        return convertString[a]
    n = divmod(a,b)
    return jinsu_rec(a//b, b)+ convertString[n[1]]


a = int(input("진수를 변환하고 싶은 숫자를 입력하세요: "))
b = int(input("몇 진수로 변환하고 싶습니까?"))
print("반복문으로 구한 %d 의 %d 진수 변환 : %s" %(a,b,jinsu(a,b)))
print("재귀법으로 구한 %d 의 %d 진수 변환 : %s" %(a,b,jinsu_rec(a,b)))

 

 

앞으로 진수변환과 관련된 코드를 작성해야하는 경우 과감하게 코딩할 수 있었으면 좋겠다 ㅎㅎ⭐️

Comments