[프로그래머스] Python - Lv.1 - 3진법 뒤집기

·2023년 4월 26일
0

코테 풀기

목록 보기
2/26
post-thumbnail

3진법 뒤집기

문제

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

n은 1 이상 100,000,000 이하인 자연수입니다.

입출력

문제 바로가기

월간 코드 챌린지 시즌1- Lv1. 3진법 뒤집기


분석 및 풀이

예를 들어, 45를 3으로 몫이 0이 될때까지 계속 나누게 되면 아래와 같이 나오게 된다

45 / 3 = 15 ··· 0
15 / 3 = 5 ··· 0
5 / 3 = 1 ··· 2
1 / 3 = 0 ··· 1  
=> 나머지: 0 0 2 1

0 0 2 1은 프로그래머스의 입출력 예시에 따르면 3진법에서 앞뒤를 반전한 값이다. 이후, 이 값을 10진수로 나타내면 문제에서 원하는 결과가 나오게 된다.


n이 0보다 큰 경우, 즉 3으로 나눌 수 있는 경우 반복적으로 3으로 n값을 나눈다. 이때 나머지는 reminder변수에 저장하여 배열arrappend()를 통해 값을 추가한다. 그리고 n값은 3을 나눈 몫으로 다시 선언해준다.

while (n > 0):
     reminder = n % 3 # 나머지
     n = n // 3 #몫으로 n값이 갱신
     arr.append(reminder)

그리고 이렇게 reminder값이 저장된 arr의 값을 출력할 경우 [0 0 2 1]과 같이 나오기 때문에 이를 0021로 나타내기 위해 join을 사용한다. 그리고 이를 다시 10진법으로 나타내야 하므로 int()를 이용한다.

#리스트 형태 없애고 일반 문자열로 나타내기
num_10 = str(''.join(str(i) for i in arr))
answer = int(num_10,3) # 10진법으로

관련 문법

  • N진수 -> 10진수
int(string, base)
print(int('101',2)) #101값이 2진수임을 의미

이는 해당 변수 stringbase진수임을 의미한다. 즉, base2이면 해당 string값은 2진수임을 의미한다. 내가 입력했던 코드 (아래 코드)의 경우에도 해당 함수를 사용하기 위해 num_10string값으로 변환하였다.

num_10 = str(''.join(str(i) for i in arr))
answer = int(num_10,3) 

최종 풀이 코드

def solution(n):
    answer = 0
    arr = []
    
    # 3진법 (앞뒤 반전)
    while (n > 0):
        a = n % 3
        n = n // 3
        arr.append(a)
    
    #리스트 형태 없애고 일반 문자열로 나타내기
    num_10 = str(''.join(str(i) for i in arr))
    answer = int(num_10,3) # 10진법으로
    
    return answer

다른 사람의 풀이

우선 아래처럼 tmp=''로 해놓으면 join함수 없이 바로 나머지값만을 문자열로 출력할 수 있다. 나는 배열을 이용했는데 이럴때는 그냥 빈 문자열을 할당하는 것이 코드 한 줄이라도 더 줄이고 효율적으로 할 수 있을 것 같다.

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3)
        n = n // 3

    answer = int(tmp, 3)
    return answer

0개의 댓글