124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
124 나라에는 자연수만 존재합니다.
124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 | 124 나라 | 10진법 | 124 나라 |
---|---|---|---|
1 | 1 | 6 | 14 |
2 | 2 | 7 | 21 |
3 | 4 | 8 | 22 |
4 | 11 | 9 | 24 |
5 | 12 | 10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
n은 500,000,000이하의 자연수 입니다.
n | result |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
해설
3진법으로 풀면 될거 같은데 그렇게 쉽게도 풀리는게 아닌 문제였다.
가장큰 힌트는 3진법과 124나라의 공통점과 차이점이다공통점 : 3가지 수를 사용한다.
3진법 -> 1,2,0
124나라 -> 1,2,4차이점 :
3진법은 3을 표현하기 위해서 0을 사용, 124나라는 4를 사용하게 된다. 그러나 3진법에서 3을 표현할 시 0혼자 등장하지 못한다. 앞에 1이 들어가서 10<-으로 표기가 되야 한다. 이점이 바로 차이점이다.1,2,3 을 {1,2,4}로 표현하기 전에 3진법으로 풀면 1,2,10 이다. 3은 10으로 두자리가 된다.
하지만 124나라 기법으로 하면 두자리가 아니고 3은 4<-가 된다.
이것을 유의하기만 하면 되는데풀이
- 숫자 n이 3보다 크고 3으로 계속 나누어 지는지 체크한다.
이 이유는 3진법으로 변환하기 위해서이다.- 숫자 n을 3으로 나눈 나머지가 0인지 본다. - >3, 9, 27 등 3의 n제곱들인지 체크하기 위해서이다.
이 숫자들을 3진법으로 표현 하면
10진법 124 나라 3진법 3 4 10 9 24 100 27 224 1000 n이 3으로 나누어 떨어질 때
- n이 3으로 나누어 떨어진다면, (3진법에서는 0<-, 124나라에서는 4<-)를 리스트에 저장.
- n이 3으로 나누어 떨어진다면, n = n-1 (n이 3이라면 ➡️ n = 2 )
- n 을 3으로 나눈 몫으로 다시 저장 =>while문 반복
n이 3으로 나누어 떨어지지 않을 때🙅♀️❌
- n %3 나머지를 리스트에 저장
- n 을 3으로 나눈 몫으로 다시 저장 =>while문 반복
.
.
최종 몫이 0이 아니면 몫을 리스트에 저장자 이제 리스트에 저장 된 것을 거꾸로 꺼내어서 [4,1,2] 순서에 맞춰서 answer에 재저장 후 출력.
def solution(n):
nation = [4, 1, 2]
li = []
if n > 0:
temp = n
while temp // 3 > 0:
if temp % 3 == 0:
li.append(temp % 3)
temp = temp - 1
else:
li.append(temp % 3)
temp = temp // 3
if temp != 0:
li.append(temp)
answer = []
for i in li[::-1]:
if i == 0:
answer.append(str(nation[i]))
elif i == 1:
answer.append(str(nation[i]))
elif i == 2:
answer.append(str(nation[i]))
return ''.join(answer)
n 이 3으로 나누어떨어진다면 n-1 을 하는데 어떻게 이 방법에 도달하신건가요? 전 생각이 안나더라구요