-문제 설명
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 함수를 완성해 주세요.
- 내가 푼 코드
def solution(n):
answer = []
while n > 0:
answer.append('124'[(n-1)%3])
n = (n-1)//3
return ''.join(answer[::-1])
-문제풀이
코드는 엄청 짧은데 2시간 동안 고민했다..
일단 124 나라는 3진법을 이용한다.
012 를 각각 124로 생각하면 된다.
1. 첫 번째 시도
While 문을 돌며 n-1을 3으로 나눈 나머지를 수집, 2는 4로 치환 1은 2로치환 0은 1로 치환
=> 될 리가 없다
2. 두 번째 시도
설명 불가 ... 아무튼 머릿속으로 뭔가 열심히 생각했는데 막상 코드로 짜려니까 엉망진창이라 포기했다.
다시 생각하려니까 기억 안난다. 여기에서 1시간을 날렸다.
3. 세 번째 시도
2진법 계산을 다시 떠올려 보았다.
피연산자를 2로 나누고 나머지, 몫을 분리.
몫을 다시 피연산자로 하여 2로 나누고 다시 나머지와 몫을 분리...
3진법도 똑같이 해주면 되는 거 아닌가 ?! 라는 생각이 들었다.
종이에 그려가며 적용해 보았다. 활용하는 숫자가 10진법 기반이기 때문에 n-1을 해주어야 0 개념을 없앨 수 있다.
원래 3진법일 경우 310 = 103 이지만, n-1을 해준 뒤 3을 2로 생각하면 310=23=4124나라이 된다.
이때 , 아래첨자는 진법을 뜻한다.
10진법 숫자 10을 124 나라의 숫자로 표현하기 위해 3진법으로 바꿔보자.
1. n-1 적용 : 10-1 = 9
2. 9/3 -> 몫 : 3, 나머지 :0
-> 나머지는 1로 치환해주고, 몫을 다시 n-1 해준 뒤 3으로 나눔
3. 2/3 -> 몫 : 0, 나머지 :2
-> 나머지 4로 치환 몫은 0 이므로 계산 종료
10 = 41124나라
계산한 결과가 맞다! n이 0과 같거나 작아지기 전까지 while문을 돌며 124나라의 진법으로 변환해준다!
몫에 계속 n-1을 해주는 것이 포인트였다.
다른 사람은 divmod 함수와 재귀를 이용한 것을 보았다.
divmod는 몫과 나머지를 반환해주는 기본 메서드다.
'알고리즘' 카테고리의 다른 글
[백준] 2839. 설탕 배달 (0) | 2020.11.16 |
---|---|
[SWEA] 전기버스 (Python) (0) | 2020.10.21 |
[SWEA] 숫자 카드 (Python) (0) | 2020.10.21 |
[SWEA] 구간 합 (Python) (0) | 2020.10.21 |
[SWEA] 5658. 보물상자 비밀번호 (Python) (0) | 2020.10.21 |