문제11 - 3진법 뒤집기 (Python)

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

10진법 수를 3진법으로 변환한 뒤 이를 반전시키고, 다시 10진법으로 변환하는 문제입니다. base_change라는 범용적인 진법 변환 함수를 유지하면서 파이썬의 내장 기능을 활용하여 가독성과 효율성을 높였습니다.


1.  나의 풀이

진법 변환이라는 고유의 기능을 수행하는 함수와 문제의 요구사항에 맞춰 반전 및 재변환을 수행하는 함수로 나누어 구현했습니다.

def base_change(num, base):
    # 0일 경우 문자열 '0' 반환하여 int() 함수와의 일관성 유지
    if num == 0:
        return "0"
    
    nums = []
    while num:
        # divmod를 활용하여 몫과 나머지를 효율적으로 계산
        num, digit = divmod(num, base)
        nums.append(str(digit))
    
    # 나머지가 역순으로 쌓이므로 reversed()를 통해 정방향 진법 문자열 생성
    return ''.join(reversed(nums))


def solution(n):
    # 1. n을 3진법으로 변환 (정방향)
    base3_str = base_change(n, 3)
    
    # 2. 문자열 슬라이싱을 이용해 앞뒤 반전
    reversed_str = base3_str[::-1]
    
    # 3. int(string, base)를 이용해 10진법으로 변환
    return int(reversed_str, 3)

2. 오늘 배운 점 및 복기 노트

나머지 연산의 순서와 뒤집기 원리

10진수를 n진수로 변환할 때 나머지를 구하는 과정 자체가 가장 낮은 자릿수부터 추출하는 방식입니다.
문제에서 요구하는 '3진법 상에서 앞뒤로 뒤집은 수'는 별도의 뒤집기 연산 없이 진법 변환 과정에서 생성된 나머지를 순서대로 이어 붙이는 것만으로 구현이 가능합니다.

파이썬 int() 함수의 확장성

일반적으로 int() 함수는 문자열을 정수로 바꾸는 용도로만 사용하지만, 두 번째 인자에 진법(base)을 전달하면 해당 진법으로 작성된 문자열을 곧바로 10진수 정수로 변환해준다는 점을 학습했습니다. 이는 직접 거듭제곱을 계산하는 로직보다 훨씬 간결하고 실수를 줄여주는 방식입니다.


3.  프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점

divmod 함수를 통한 코드 최적화

교재에서는 num // radix와 num % radix를 각각 수행하는 대신 divmod(num, radix)를 사용하여 한 번의 연산으로 몫과 나머지를 처리합니다. 이는 가독성을 높일 뿐만 아니라 대량의 연산이 필요한 상황에서 효율적입니다.

 

슬라이싱을 이용한 문자열 제어

문자열을 뒤집어야 하는 상황에서 별도의 반복문이나 reversed() 함수를 사용하는 대신 [::-1] 슬라이싱 기법을 사용하는 것이 파이썬다운 방식임을 강조하고 있습니다. 이번 문제에서는 진법 변환 과정의 특성상 생략이 가능했으나, 문자열 처리의 기본기로서 중요한 테크닉입니다.