ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 프로그래머스 : 3진법 뒤집기
    코딩테스트/프로그래머스 2024. 7. 18. 14:12

    [문제 풀기 전 생각한 부분]

    1. 10진법에서 3진법으로 어떻게 변환되나?

    2. n 을 3으로 나눈 나머지를 문자열 형태로 저장한 뒤 뒤집으면 된다.

    3. 저장한 문자열의 길이만큼 순회해서 곱하고 더해준다. 


    [my_code]

    위 2번을 생각해볼 때 문자열을 따로 뒤집을 필요가 없다. 문자열을 저장할 때, 뒤집지 않아도 거꾸로 들어간다. 

    n = 45
    rest = ''
    
    while n > 0:
        rest += str(n % 3)
        n = n // 3
    
    print(rest) # 0021

     

    10진법에서 3진법으로 어떻게 바꿀 수 있을까?

    - 구현한 코드부터 보자 ! 

    n = 45
    rest = ''
    
    while n > 0:
        rest += str(n % 3)
        n = n // 3
    
    number = 0
    # print(len(rest)) # 길이는 4
    
    for i in range(len(rest)):
        number += int(rest[i]) * (3 **(len(rest) - 1 - i))
    
    print(number)

    - 위에서 아래로 설명하겠습니다. 

    - n과 rest를 초기화해준다. ( n이라는 박스에 정수 45를 넣고, rest 란 상자에 빈문자열을 만들어 준다고 생각하세요.)

    - rest를 문자열로 초기화한 이유 : 문제와 비슷하게 하고 싶기 때문이다. 사실 제 풀이로는 list 로 초기화 해도 상관 없습니다.

    - while문 사용 이유 : n에 어떤 숫자가 들어갈 지 알면 정확한 반복 횟수를 넣을 수 있겠지만, n에 어떤 숫자가 들어갈지 모르기 때문에 while문을 사용해서 n > 0을 만족하는 경우에만 반복 하도록 하였습니다. 

    - while 문의 n은 2가지 의미를 갖는다. 처음 들어온 값. 그 뒤로는 몫의 역할을 합니다. 

    - rest 에 n 을 3 으로 나눈 나머지를 차례로 저장합니다. 

    - n = n // 3 은 n //= 3과 같은 의미를 가집니다. n //= 3 을 통해 while 문이 반복되면서 n 값이 n을 3으로 나눈 몫으로 업데이트 됩니다. ex) 45 // 3 = 15(=n),   15 // 3 = 5(=n) ,.... 

    - 최종 결과를 넣을 number를 초기화 합니다. 

    - 주석에서 봤듯이 rest의 길이는 4 입니다.

    - for i in range(len(rest)) 는 rest의 길이 4만큼 반복. 즉, 4번 반복한다는 말입니다. 이 때 i 는 0,1,2,3 의 값을 가집니다.

    - range(len(rest)) 를 사용한 이유는 인덱스의 특징이 0부터 시작하기 때문에 그렇게 사용했습니다. 

    - i = 0 일 때,

    - number = number + int(rest[0]) * (3 ** (len(rest) - 1 - 0))

    - 0 = 0 + 0 * ( 3 ** ( 4 - 1- 0 )

    위 식을 잘 보고 이해하시기 바랍니다. ! 힌트를 드리자면..아래 참고... + number은 for문 안에서 계속 업데이트 됩니다. 

    우리가 평소 수학에서 쓰는 = 기호는 같다의 의미지만, 프로그래밍에서  = 의 의미는 오른쪽에 있는 값을 왼쪽에 대입한다고 생각하면 됩니다. ex) a = 10, 10을 a에 대입한다. 

    45 (10진법) -> 1200(3진법)

    3 ** 3 + (3 ** 2) * 2 + (3 ** 1) * 0 + (3 ** 0) * 0 = 45

     

    [다른 방법 찾아서 적용해보기]

    # 몫과 나머지 구하는 방법 다르게 해보기.
    while n >= 0:			
        n, re = divmod(n,3)	
        answer += str(re)

    충격이다. 근데 익숙하지 않아서 헷갈린다. 

    n = 45
    rest = ""
    
    while n > 0:
        rest += str(n % 3)
        n = n // 3
    
    number = int(rest, 3)
    
    print(number)

    제일 충격이다. int 에 내장되어 있는 기능 뭐야.. 

    base 확인 과 bit_length() 또한 알 수 있다. 
    https://codetorial.net/tips_and_examples/int_function.html < -블로그 참고

Designed by Tistory.