2019년 6월 9일 일요일

#41 알고리즘 연습 - 124 나라의 숫자 - Python


124 나라의 숫자


문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법124 나라10진법124 나라
11614
22721
34822
411924
5121041
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
제한사항
  • n은 500,000,000이하의 자연수 입니다.

입출력 예
nresult
11
22
34
411





문제풀이 IDEA


1,2,4 라는 숫자로 표현하는것 외에는 3진수와 표현이 같은 방식이다

하지만 이를 시각적으로 확인을 해보면
1 - 1    2 - 2   3 - 4
4 - 11  5 - 12  6 - 14
7 - 21  8 - 22  9 - 24

3으로 나눈 나머지에 따라 마지막 자리수가 결정되는 것을 알수 있다.
그리고 7의 경우 7 = 3*2 + 1 이라서 마지막자리에 1이 붙고 몫인 2에 대해서는 2가 붙는다.

예외적으로 3의 배수인 경우 3으로 나눈 몫-1 에 대응되는 수를 가져온다




나의 코드


def solution(n):
answer = '' #124로 구성된 수를 더하기 위해 문자열을 준비한다
ans_dict = {0: 4, 1: 1, 2: 2} #나머지에 대응되는 수를 뽑아오기 위해 dict을 사용했는데 list로 해도 무방할것 같다
while True: #beak조건을 만족하기 전에는 지속적으로 n을 연산하여 update해줍니다
answer = str(ans_dict[n % 3]) + answer #answer += str()을 안해준 이유는 update되는 n%3에 대해 추가되는 수는 앞쪽에 더해져야하므로
if n % 3 == 0: #만약 n이 3의 배수이면 n//3이 아니라 n//3-1을 저장해줘 1,2,4 숫자와 제대로 대응시켜준다
n = n//3 - 1
else: #그게 아니라면 n을 n//3으로 update해준다.
n = n//3
if n == 0: #그리고 반복문에서 n이 0이면 더 이상 연산을 진행하지 않아도 되므로
break #break해준다
return answer

다른 코드


def change124(n):
num = ['1', '2', '4'] #대응되는 수를 list의 index로 가져올 수 있게 한다.
answer = ""

while n > 0: #n이 0이면 while문이 끝나게 한다
n -= 1 #나머지에 대응해보면 0 : 4 , 1: 1 , 2 : 2 인데
#n -1 을 해주고 list의 원소순서를 고쳐 코드를 if문으로 상황에 따라 나누지 않아도 되도록 했다
answer = num[n % 3] + answer
n //= 3

return answer






출처 : 프로그래머스

가장 많이 본 글