알고리즘 문제를 풀다보면 10진수에서 2진수로 2진수에서 10진수로 변경을 필요로 하는 문제가 많이 있습니다.


이러한 문제가 나오는 이유는 컴퓨터가 애초에 2진수 체계로 만들어져 있기 때문에 컴퓨터에 대한 이해에 있어서 진법을 이해하는 것이 중요하기 때문이라고 생각합니다.



실제로 컴퓨터에서 곱하기 연산이나 나누기 연산을 한 자리 씩 shift 시키면서 하는 것을 보면


흡사 십진수를 이진수로 변환하는 프로그래밍과 유사하다는 느낌도 받았습니다.(저의 개인적인 생각입니다...!)




십진수를 이진수로 바꾸는 방법은 십진수를 2로 나눈 몫, 나머지 를 이용해서 각 자리를 정해줍니다.


19 이라는 수가 있다면


맨처음 2로 나누면 몫 9이고 나머지는 1 이기 때문에 최하위 bit 1이되고


다시 9를 2로 나누면 몫 4 이고 나머지는 1이기 때문에 그 다음 자리의 bit 1이 됩니다.


계속에서 끝까지 살펴보면 4를 2로 나누면 몫2 나머지 0 그 다음 자리의 bit 0


그 다음 2를 2로 나누면 몫 1 나머지 0 이니깐 그 다음 자리의 bit 0


이제 1을 2로 나누면 몫 0 나머지 1 이니깐 최상위 비트는 1 그리고 몫이 0이므로 루프를 종료합니다.


그래서 10001(2) 라고 변경이 됩니다.




위의 과정을 코드로 구현 하면 10진수에서 2진수로 변경하는 함수가 됩니다.


그리고 저위에 나누는 수를 2 대신 3으로 하면 3진수로 변경하는 함수가 됩니다.



제가 구현한 코드를 보면 다음과 같습니다.





테스트코드에서 사용한 bin 함수는 파이썬에서 10진수를 2진수로 변환하는 builtin 함수입니다. 


bin(20) 을 출력하면 '0b10100' 문자열로 앞에 0b를 출력하기 때문에 이부분을 제외하기 위해서 slicing을 해서 int로 형변환을 하였습니다.




복사 가능한 코드


def change_binary(n : int) -> int:

    result, idx = 0,0

    while (n >=1):

        remainder =n % 2

        n = n // 2

        result += (10**idx)* remainder

        idx +=1

    return result



위에서 이야기 한 것처럼 이번에는 3진수로 변환하는 함수를 그대로 구현보겠습니다.





3진수로 변환하는 함수는 단순히 나누는 수를 2->3으로 변경한 것입니다. 


그렇기 때문에 2진수로 바꾸는 방법을 이해하신 분은 4진수 5진수 등도 쉽게 변경하는 함수를 만들 수 있을 것 입니다.






조언이나 피드백은 언제나 감사합니다.


감사합니다.





+ Recent posts