

10진법이 124진법(?)으로 바뀐 문제이다. 숫자가 124 밖에 없다고 생각하고 쭉 써나가면서 규칙을 찾으면 된다. 대충봐도 숫자가 3개니까 3으로 나눠보면 될 것 같았다. 처음엔 너무 어렵게 접근해서 3의 제곱수를 더해나가면서 찾는건가? 싶었는데 그냥 3으로 나눈 몫과 나머지를 쭉 적다보니까 규칙이 구해졌다.
일단 1부터 10까지 3으로 나눈 몫과 나머지를 정렬하면 다음과 같다
1 = (0, 1) = 1
2 = (0, 2) = 2
3 = (1, 0) = 4
4 = (1, 1) = 11
5 = (1, 2) = 12
6 = (2, 0) = 14
7 = (2, 1) = 21
8 = (2, 2) = 22
9 = (3, 0) = 24
10 = (3, 1) = 41
...
28 = (9, 1) = 241
자세히 보면 나머지 1, 2, 0이 각각 1, 2, 4에 대응된다는 걸 볼 수 있다. 이제 나머지는 제외하고 몫만 가지고 똑같은 과정을 반복한다. 몫이 0이 될 때까지 이 과정을 반복하면서 나머지만 가지고 값을 대칭하면 답을 구할 수 있다.
28의 경우 몫이 9이고 나머지가 1인데, 몫의 숫자 9는 124 숫자로 변경하면 24이다. 이 숫자는 28을 124 숫자로 변경했을 때 앞의 2자리숫자가 되는 것을 볼 수 있다. 각 과정에서 구해지는 나머지를 가장 오른쪽 문자로 두고 몫만 가지고 반복하면 된다.
단 이때 나머지가 0인 경우는 몫에서 1을 빼줘야 제대로 된 값을 구할 수 있다. 숫자는 3단계로 끊기게 되는데 3으로 나눠줬을 때의 나머지는 0, 1, 2 순서이기 때문에 나머지를 1, 2, 0 순서로 구하고 있는 현재는 마지막 나머지 0일때의 몫이 이전 1, 2일 때보다 1 높을 수 밖에 없다. 이 부분만 예외처리를 해주면 된다.
def solution(n):
ans = ""
while n > 0:
n, r = divmod(n, 3)
if not r:
n -= 1
r = 4
ans += str(r)
return ans[::-1]