일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준
- ubuntu
- 파이썬
- 프로그래머스
- 실전알고리즘
- 2단계
- 딥러닝
- SWEA
- AWS
- Object detection
- Python
- 구현
- C++
- 머신러닝
- 이것이 코딩테스트다 with 파이썬
- 그리디
- docker
- 1단계
- ssd
- cs
- 자료구조 및 실습
- 전산기초
- 코드수행
- pytorch
- test-helper
- 3단계
- MySQL
- 모두를 위한 딥러닝 강좌 시즌1
- STL
- CS231n
- Today
- Total
곰퓨타의 SW 이야기
[python] 진수변환 뿌시기 🔥 본문
문제들을 해결하면서 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)
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)))
앞으로 진수변환과 관련된 코드를 작성해야하는 경우 과감하게 코딩할 수 있었으면 좋겠다 ㅎㅎ⭐️
'TIL > 코테개념_python' 카테고리의 다른 글
[python] 문자열 포매팅 뿌시기! (0) | 2021.01.03 |
---|---|
[python] 문자열 연산 및 인덱싱, 슬라이싱 뿌시기 (0) | 2021.01.03 |
[python] 문자열 함수 뿌시기 🔥 (0) | 2021.01.03 |
[python] numpy 사용법 뿌시기 (0) | 2021.01.01 |
[python] zip을 이러한 방법으로 활용한다구 ?? (0) | 2020.12.30 |