지나가던 개발자
[Python] 진수 변환기 만들기 본문
코딩을 하다보면... 특히 프로그래머스나 등등에서 문제를 풀다보면,,, "진수"를 변환해야 할 일이 매우 자주 생깁니다.
파이썬에서 2, 8, 16진수는 bin(), oct(), hex()라는 매우 좋은 내장함수를 사용하여 쉽게 바꿀 수 있습니다만, 3진수라던가, 11진수라던가, 1000진수가 나온다던가(설마 그럴 일은 없겠죠) 하면 직접 만들어야 합니다.
직접 만들기 위해서 진수 변환의 원리를 알아보자면,
위 그림에서 보는게 정말 그냥 진수 변환의 원리입니다.
변환할 수를 변환할 진법으로 계속 나눈 뒤 나오는 나머지! 그게 바로 진수 변환이에요.
그래서 그렇게 코드를 짜보면...
def jinsu(n, m):
hihi = []
while True:
if n // m == 0:
hihi.append(n)
break
hihi.append(n%m)
n = n // m
hihi.reverse()
return int("".join(map(str,hihi)))
n = int(input("어떤 숫자를: "))
m = int(input("몇 진수로: "))
hehe = jinsu(n,m)
print(hehe)
쉽게 이해가 가능한 코드가 나왔죠?
변환할 수 n과 진수 m을 받아와서, n을 m으로 나눈 나머지를 리스트에 저장한 후, n을 m으로 나눈 몫으로 바꿔 줍니다.
n // m이 0이라면(더 이상 나눠지지 않는다면), 마지막으로 남은 n을 리스트에 저장하고, while문을 멈추죠.
여기서 제작된 리스트를 뒤집어 이진수 리스트를 완성하고, 이를 합쳐 return해줍니다.
실행해보면..
이렇게 정확하게 나오는 것을 보실 수 있습니다.
그렇지만 이거는 10진법 -> N진법만 가능하고, N진법에서 10진법으로 변환은 불가능합니다.
이번엔 N진법에서 10진법으로 전환하는 코드를 작성하여 봅시다.
N진법에서 10진법으로 전환하는 원리는 간단합니다.
예를 들어 아까 53은 이진수로 110101이었죠?
53에서 3은 1의 자리, 5는 10의 자리, 만약 3번째 자리가 있다면 그거는 10^2(100)의 자리겠죠.
이진수도 마찬가집니다. 맨 뒤에 1은 1의 자리, 0은 2의 자리, 1은 2^2(4)의 자리, 0은 2^3(8)의 자리, 1은 2^4(16)의 자리, 맨 앞의 1은 2^5(32)의 자리입니다.
그래서 1은 있다, 0은 없다고 생각하면 1이 하나, 2는 없고, 4는 하나, 8은 없고, 16이 하나, 마지막 32가 하나. 가 되서 1+4+16+32 = 53 이 되는 겁니다.
이러한 원리로 코드를 짜봅시다.
def jinsu(n, m):
hihi = list(map(int, list(str(n))))
length = len(hihi)
for i in range(len(hihi)):
length -= 1
hihi[i] = hihi[i] * (m**(length))
return sum(hihi)
m = int(input("몇 진수인: "))
n = int(input("어떤 숫자를: "))
hehe = jinsu(n,m)
print(hehe)
얘도 똑같이 jinsu 함수로 작성했습니다. 둘 다 사용하실거면 적절히 함수명을 바꾸어 사용하세요!
암튼 그래서 이 친구는 우선 n을 자릿수별로 분리한 리스트로 만듭니다.
그 뒤에 그 길이를 재는데, 그 이유는 얼마나 제곱해야 하는지 알기 위해서입니다.
그리고 length에서 1을 빼주고(예로, 셋째자리는 m^2, 둘째는 m^1, 첫째는 m^0만큼 곱해야 하기 때문이죠.), hihi 리스트의 i번째 요소를 m^(length)만큼 곱해준 후, 완전히 변환된 hihi 리스트를 다 더해서 return해줍니다.
'Developing > Python' 카테고리의 다른 글
[Python] googletrans 모듈을 사용한 번역기 만들기 (1) | 2022.01.22 |
---|---|
[Python] beautifulsoup를 사용한 웹 크롤링 예제 - 노래 가사 가져오기 (0) | 2021.12.20 |
[Python] 소인수분해 프로그램 만들기 (0) | 2021.11.25 |
[Python] 히라가나를 가타카나로 바꾸는 프로그램 만들기 (0) | 2021.09.03 |
[Python] 마이크로비트로 모스부호 송수신기 만들기 (0) | 2021.08.28 |