본문 바로가기
Python

본 캠프 Python 알고리즘 코드카타 5일차

by Data 학습자 2024. 6. 28.

오늘 풀어본 문제

https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

 

기본적으로 파이썬 자체적으로 n진수를 10진수로 변환을 해주는 간단한 명령어가 존재한다.

int('num',number)

int('num',n)

 

 

파이썬에서 int('num', n) 구문을 사용할 때, 'num'은 문자열로 표현된 숫자이고, n은 기수(진법)를 나타냅니다. 이 구문은 'num'이라는 문자열을 n진법으로 표현된 숫자로 해석하고, 이를 파이썬의 정수(int) 타입으로 변환해줍니다.

 

파이썬의 int() 함수는 두 개의 매개변수를 받을 수 있습니다:

  1. 첫 번째 매개변수는 숫자를 나타내는 문자열입니다.
  2. 두 번째 매개변수는 기수(진법)를 나타내며, 이는 옵션입니다. 이 매개변수의 기본값은 10입니다. 이를 통해 10진수, 2진수, 8진수, 16진수 등 다양한 진법의 숫자를 정수로 변환할 수 있습니다.

주어진 문자열에 사용된 각 문자는 해당 진법에서 유효한 숫자여야 하며, 가장 왼쪽의 문자가 가장 높은 자리수를 나타내고, 가장 오른쪽의 문자가 가장 낮은 자리수를 나타냅니다. 각 자리의 값에 해당 진법의 자릿수 거듭제곱을 곱한 후, 이를 모두 더해 최종 값을 계산합니다.

 

그리고 추가로 알아야 둬야 할 부분은 10진수를 n진수로 바꿔야 하는 것도 알아야한다

 

기본적으로 2, 8, 16진수는 따로 명령어가 존재한다.

각각 bin(), oct(), hex() 명령어가 있으며 활용 방법은 괄호안에 진수로 바꿀 n의 값을 넣어주면 된다.

 

하지만 문제에선 3진수 즉 명령어가 아닌 따로 진수변환 함수를 구축해야한다는 조건이 있다 이를 해결하기 위해선

def solution(num):
    n = 3
    answer = ''
    while num:
        answer += str(num % b)
        num = num // b
    return answer[::-1]

 

이 공식의 알고리즘에 대해 이해를 해야한다.

 

  • 나머지 계산 (n % b)   주어진 숫자 n을 b로 나눈 나머지를 계산합니다. 이 나머지는 b진법에서 n을 표현할 때 가장 낮은 자리수(가장 오른쪽 숫자)입니다.
  • 몫 계산 (n = n // b)   n을 b로 나눈 몫을 새로운 n으로 업데이트합니다. 이는 변환 과정에서 다음 자리 숫자를 구하기 위해 현재 자리 숫자를 제거하는 효과가 있습니다.
  • 문자열 추가 (answer += str(n % b))   계산된 나머지를 문자열로 변환하여 answer 문자열에 추가합니다. 이 과정은 반복되며, 각 반복에서는 n의 다음 자리수가 처리됩니다.
  • 결과물 뒤집기 (answer[::-1])   answer에 집어넣은 진수들은 (answer += str(num % b)) 에서 문자열을 추적하며 역순으로 저장되게 됩니다 그로인해 올바르게 진수로 변환하기 위해선 ([::-1])을 사용하여 뒤집을 수 있습니다.

이 알고리즘과 위의 진수 변환을 알고 있다면 문제 풀기가 아주 쉬워진다. 일단 뒤집은 결과값이 필요하니 []::-1 구문은 필요가 없어졌으며 return에 위의 int('num',n) 를 활용하면 된다.

 

def solution(num):
    b = 3
    
    answer = ''
    while num:
        answer += str(num % b)
        num = num // b
        
    return int(answer,3)