[프로그래머스] Lv2. 124 나라의 숫자

lemythe423·2023년 8월 10일
0
post-thumbnail

🔍 문제링크

풀이

규칙을 찾아내는 문제

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]
        

    
profile
아무말이나하기

0개의 댓글