파이썬 실습(프로그래머스)
* 124 나라의 숫자
문제: 124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요. (n은 자연수)
솔루션(다른 사람의 코드를 보고 풀었다..ㅠㅠㅠ)
def solution(n):
li = []
while n // 3 > 0:
if n % 3 == 0:
li.append(n % 3)
n = n - 1
else:
li.append(n % 3) =
n = n // 3
if n != 0:
li.append(n)
answer = ''
for i in li[::-1]:
if i == 0:
answer+= str(4)
elif i == 1:
answer+= str(i)
else:
answer+= str(i)
return answer
- li[start : end : step] : 리스트의 시작, 끝, 간격을 지정할 수 있다. 이 문제의 경우 간격을 -1로 지정하였다. 그러면 리스트의 맨 끝에서부터 거꾸로 차례차례 시작한다. 이렇게 해주는 이유는 이 문제에서 진법을 활용하기 때문이다(어떤 수를 n진법으로 변환하려면 그 수를 0이 될 때까지 n으로 나누고, 그 나머지를 거꾸로 읽어 올라가면 된다). 즉 3으로 나눈 각각의 나머지들을 순서대로 리스트에 집어넣고, 다시 거꾸로 뽑아오는 것이라 생각하면 된다(물론 4라는 예외가 존재한다).
- 이 문제는 3진법과 굉장히 유사하다. 자연수를 0,1,2로만 표현하는 3진법처럼 자연수를 1,2,4로만 표현하는 것이 이 문제의 특징이다.
- 그런데 큰 차이점이 하나 존재한다. 바로 4의 존재이다. 3진법과 다르게 이 문제에서는 4를 써야한다. 그리고 4를 쓰는 순간 3진법과 자릿수가 달라지게 된다.
- 하지만 쉽게 생각해보자. 이 문제에서는, 3으로 나누었을 때 나머지가 0인 경우 0을 4로 변환해주면 된다. 그리고 이 경우일 때, n에서 1을 빼주어 몫을 1 감소시켜주면 될 것이다. (3진법의 경우 자연수를 표현할 때 3을 쓰지 않고 대신 자릿수를 늘리는 방식 등으로 표현하지만, 이 문제에서는 1,2,4 모두를 써야 한다. 그렇기 때문에 이 문제에서는 3진법과는 다르게 몫을 하나 차감시켜주어야 한다.)
- 정말 어려운 문제 같다. 아이디어를 떠올리는 것이 너무 힘들다.
- 참고: https://velog.io/@juni416/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-124%EB%82%98%EB%9D%BC%EC%9D%98-%EC%88%AB%EC%9E%90