[kata][python] 프로그래머스 - 124 나라의 숫자

- 2 mins

124 나라의 숫자

출처: 프로그래머스 - 124 나라의 숫자

문제

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

1  -> 1
2  -> 2
3  -> 4
4  -> 11
5  -> 12
6  -> 14
7  -> 21
8  -> 22
9  -> 24
10 -> 41

제한 조건

n은 500,000,000이하의 자연수 입니다.

내 풀이

  1 def solution(num):
  2     answer = ""
  3     while num:
  4         num, nam = divmod(num, 3)
  5         answer = "412"[nam] + answer
  6         if not nam:
  7             num -= 1
  8
  9     return answer

숫자가 세 개 밖에 없으므로 3진법의 개념을 사용했다.

기본적으로 숫자를 3으로 나누면서 나머지를 문자열로 바꾸어 정답 문자열의 앞쪽에 계속 추가해준다.

하지만 이 숫자나라에는 0이란 개념이 없으므로, 주의할 점이 있다.

나머지가 0일 경우, 0대신 4를 넣어주어야 한다.

그리고 나머지가 0일 경우, 다음 루프로 넘어가기 전에 몫에서 1을 빼주어야한다.

왜 몫에서 1을 빼주는지는 num이 3일 경우를 한 번 보자.

4번 부분에서 몫을 1 빼주게 되면, 몫이 0이되면서 loop에서 빠져나오게 된다.

그래서 정상적으로 4라는 답을 리턴하게 된다.

직관적으로 잘 와닿지 않으므로, num이 6일 경우도 한 번 보자.

나도 이게 직관적으로 떠오르지는 않았고,

계속 오몇 가지 경우를 연습장에 써보니 규칙이 발견되었다.

어쨌든 3진법으로 접근해야 한다는 것을 우선적으로 캐치해야하고,

특정 규칙에서 관련 인자들을 어떻게 컨트롤 해주어야 하는지도 규칙을 통해 알아내야한다.

(직관적으로 알아낸분들이 있다면 정말 존경스럽다)

분석

풀이에는 간단하게 푼것처럼 써놨는데, 솔직히 은근히 머리가 좀 아팠다.

3진법을 사용해서 풀어야 한다는것은 알겠고, 나머지가 0일경우 4로 바꿔주어야 한다는 것도 알겠는데,

4로 바꾸어준 이후에 몫에서 1을 빼주어야 한다는 것이 직관적으로 떠오르지 않았다.

3의 배수들에 대해 어떻게 동작해야하는지 연습장에 일일이 써가면서 겨우 규칙을 찾아냈다.

아직 ‘수’에대해 유연하게 접근하는 머리가 잘 돌아가지 않는 것 같다.

진법 변환이라던가 정렬, 수열의 규칙 등과 같은 숫자 관련 문제를 의도적으로 많이 풀어보고,

평소에도 심심하면(?) 숫자와 좀 더 친해질 수 있는 방법을 찾아서 꾸준히 반복해봐야겠다.




코딩장이

코딩장이

-장이: [접사] ‘그것과 관련된 기술을 가진 사람’의 뜻을 더하는 접미사.

rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora