본문 바로가기

문돌이 존버/프로그래밍 스터디

(프로그래머스 연습 문제 풀이) 3진법 뒤집기

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

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

입출력 예
n            result
45             7
125          229

입출력 예 설명
입출력 예 #1
답을 도출하는 과정은 다음과 같습니다.
n (10진법)     n (3진법)     앞뒤 반전(3진법)     10진법으로 표현
    45             1200            0021                         7
따라서 7을 return 해야 합니다.

입출력 예 #2
답을 도출하는 과정은 다음과 같습니다.
n (10진법)      n (3진법)    앞뒤 반전(3진법)     10진법으로 표현
   125             11122           22111                     229
따라서 229를 return 해야 합니다.
def solution(n):
    answer = 0
    result = ''
    while n > 0:
        result = str(n % 3) + result # 나머지로 3진법 표현
        n = n // 3
    print(result)
    for i in range(len(result)):
        answer += int(result[i]) * 3**i
    return answer

10진법을 2진법이든, 3진법이든 n진법으로 변환하기 위해서 할 일은 10진법 숫자를 n으로 나누는 것이다. 나누었을 때의 나머지가 1의 자리부터 n진법 숫자가 된다고 생각하면 된다. 2진법을 예로 들어보자.

1) 10진법 숫자 10이 있다고 한다면, 2로 나누었을 때 몫은 5, 나머지는 0이 된다. 즉 2진법으로 변환했을 때 1의 자리 숫자는 0이다. 

2) 이제 5를 다시 2로 나누면 몫은 2, 나머지는 1이 된다. 2진법 2의 자리 숫자는 1이 된다. 지금까지 종합해보면 10이다.

3) 다시 2를 2로 나누면 몫은 1, 나머지는 0이 되며 2진법 3의 자리 숫자는 1이 된다. 3단계까지 정리하면 2진법으로 010이 되었다.

4) 마지막으로 1을 2로 나누면 몫은 0, 나머지는 1이 되며 몫이 0이 될 때 2로 나누는 반복을 종료한다. 

위의 단계를 종합하면 10진법은 2진법으로 1010이 되는 것이다. 간단히 말해서 n진법으로 변환하라고 한다면 원래 숫자를 n으로 나눠가며 나머지를 끝에서부터 채워넣고 몫이 0이 될 때 반복을 종료하면 된다.

이후 다시 10진법으로 변환하는 것은 간단한다. 자리수에 따라 3의 n제곱을 취해주면서 다 더해주면 된다.

728x90
반응형