[Python] 코딩 도장 - 10진수를 n진수로 변환하기

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 10진수를 n진수로 변환하기] - Lv.2

다음은 233 이란 10진수를 2진수로 변환하는 과정을 나타낸 그림이다.

위 그림을 참조하여 라이브러리를 사용하지 말고 10진수를 n진수로 변환하는 프로그램을 작성하시오.. (단, n의 범위는 2 <= n <= 16)

예)

  • 2진수로 변환 : 233 –> 11101001

  • 8진수로 변환 : 233 –> 351

  • 16진수로 변환 : 233 –> E9

출처: https://codingdojang.com/scode/458?answer_mode=hide


[풀이]

def f(k,n):
    a = []
    while k >= n:
        a.append(k % n)
        k = k // n
    a.append(k)

    b = ["A", "B", "C", "D", "E"]

    for i in range(len(a)):
        idx = a[i] - 10
        if idx >=0:
            a[i] = b[idx]
        else:
            a[i] = str(a[i])

    return print("".join(a[::-1]))

f(233,2)
f(233,8)
f(233,16)
11101001
351
E9

몫이 0이 될 때까지 나머지를 구하는게 중요하고 그 후 나머지를 역순으로 결합하였다.

다만 10진수 이상은 나머지가 두 자리 이상이 될 수 있고 이 경우 알파벳으로 변환하여야 한다.

난 A~E까지 리스트를 만들고 나머지 - 10을 인덱스로 사용해 값을 변환하였다.

[추천 풀이]

def convert(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base)
    if q == 0:
        return T[r]
    else:
        return convert(q, base) + T[r]


print(convert(233, 2))
print(convert(233, 8))
print(convert(233, 16))
11101001
351
E9

이 분은 재귀 방식을 사용하였고 처음부터 T라는 값의 경우의 수를 전체로 만들어 두셨다.

이를 이용해서 나머지를 인덱스로 사용해서 변환하는 방식을 사용했다.

Leave a comment