[프로그래머스] Lv1 - 3진법 뒤집기

김멉덥·2023년 7월 10일
0

알고리즘 공부

목록 보기
27/171
post-thumbnail

문제

프로그래머스 월간 코드 챌린지 시즌 1


코드 구현

def solution(n):
    answer = 0

    # 3진법으로 변형하기
    samzinbup = []
    while (n > 0):
        div = n // 3        # 3으로 나눈 몫
        left = n % 3        # 3으로 나눈 나머지
        samzinbup.append(left)      # 나머지를 넣어주고
        n = div             # 몫을 3으로 다시 나누기위해 갱신

    # print(samzinbup)

    # 뒤집기
    sam_n = []
    for i in range(len(samzinbup) - 1, -1, -1):
        sam_n.append(samzinbup[i])

    # print(sam_n)

    # 10진법으로 계산하기
    for i in range(len(sam_n)):
        answer += sam_n[i] * (3 ** i)

    return answer

if __name__ == '__main__':
    print(solution(45))
    print(solution(125))
    print(solution(1))

풀이

  • 처음 제출했을 때 테스트 1번에서만 실패가 떴다. → 3보다 작은 1과 2을 넣었을 때 이전 코드로는 0이 나왔기 때문이다. (원래는 1, 2 이렇게 그대로 나와야함 !!)
  • 이전 코드
    def solution(n):
        answer = 0
    
        # 3진법으로 변형하기
        samzinbup = []
        while (n >= 3):
            div = n // 3        # 3으로 나눈 몫
            left = n % 3        # 3으로 나눈 나머지
            samzinbup.append(left)      # 나머지를 넣어주고
            n = div             # 몫을 3으로 다시 나누기위해 갱신
    
    				if (div < 3):
    						samzinbup.append(div)
    
    ...
    → 이전 코드에서는 3으로 나눌때까지 나누는게 아니라
    몫이 3보다 작게 남으면 이제 그 몫은 0, 1, 2 중 하나일 것이니 3으로 더 나누지않고 그 몫을 그대로 3진법 변형 리스트에 넣어주는 방법 → 그러나 3보다 작은 수를 3으로 나눈 나머지는 그대로 나오기 때문에 그럴 필요가 없었다.
  • 따라서 while문 조건을 n > 0 으로 바꿔주고 해당 if문을 없애니 통과하게 되었다.

What I Learned

int(string, n) : 해당 string을 n에 넣은 진수에서 10진수로 변환해준다. 즉, n진법으로 변환이 가능하다.

참고 : https://velog.io/@code_angler/파이썬-진수변환2진법-3진법-5진법-10진법n진법

print(int('101',2))
print(int('202',3))
print(int('303',4))
print(int('404',5))
print(int('505',6))
print(int('ACF',16))

>> 20
>> 51
>> 104
>> 185
>> 2767
profile
데굴데굴 뚝딱뚝딱 개발기록

0개의 댓글