본문 바로가기
Algorithm/Programmers

[Algorithm] 프로그래머스 - 3진법 뒤집기

by 홍월이_ 2022. 12. 28.

시작하며...

모든 알고리즘 문제 풀이는 제가 직접 짜서 정답을 맞춘 결과만을 공유합니다.

마지막 'More Solution'은 다른 정답자들 풀이 중 생각지 못했던 부분들이나 좋게 느껴진 풀이법 몇개를 가져와서 공유하였습니다.

 

[Level 1] 3진법 뒤집기

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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


제한사항

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

입출력 예

입출력 예 설명

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
  • 따라서 7을 return 해야 합니다.

입출력 예 #2

  • 답을 도출하는 과정은 다음과 같습니다.
  • 따라서 229를 return 해야 합니다.

 

My Solution

def convert(num, base):
    num_ = '0123456789abcdef'
    n, b = divmod(num, base)
    if n == 0:
        return num_[b]
    else:
        return convert(n, base) + num_[b]
    
def solution(n):
    answer = convert(n, 3)
    rev_answer = answer[::-1]
    return int(rev_answer, 3)

주어진 10진수를 3진수로 변환하고 뒤집어서 되돌리는 문제이다.

10진수를 3진수로 변환을 할 수 있어야 한다...

2진법, 8진법, 16진법은 파이썬의 함수를 이용하여 쉽게 변환할수 있는데, 3진법 변환은 제공하지 않기 때문에 n진법 변환 메서드를 정의하였다.

  • 입력받는 숫자 num, 변환할 진법 base를 매개변수로 하는 함수 convert 정의
  • num_ 변수에는 각 진법에서 활용하는 숫자들을 정의해주었다. 최대 16진법까지 변환 가능하도록 0 ~ f까지
  • divmod() 함수를 이용 - divmod는 두 수를 나눈 몫과 나머지를 반환
  • 나머지 b를 이용하여 문자열 num_에서 값을 가져오고 몫인 n은 다시 convert 함수에 넣는 재귀함수로 구성
  • n이 0이면 더이상 나눌 필요가 없으므로 나머지에 위치한 값을 리턴하고 메소드 종료 
    • 입출력 예를 이용하여 설명하면 45를 3으로 나누면 첫번째에서는 15, 0을 반환하므로 3진법 변환 제일 끝 숫자는 num_[0], '0'이 됨
    • 15를 다시 convert에 넣고 5, 0을 반환하고 num_[0] 을 더해줌
    • 계속 해서 넣게 되면 1 2 0 0 의 숫자를 반환받는다.
  • 문제에서 주어진 숫자 n 을 3진법으로 변환하는 메서드를 이용하여 변환한 숫자를 answer에 담아준다 - convert(n, 3)
  • 주어진 숫자 문자열을 뒤집어주어주고 rev_answer에 저장 - answer[:: -1]
  • 뒤집은 숫자 문자열을 int( ) 함수를 이용해 10진법으로 변환한 후 리턴한다.

댓글