문제는 아래와 같습니다.

https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

 


풀이는 다음과 같습니다.

 

1. 124나라는 우리가 사용하는 10진법 체계에서 3진법으로 바꾼 후 새로운 규칙을 더해 변형된 숫자를 이용한다.

 

2. 10진법에서 3진법으로 바꾸는 방식은 아래와 같다. 

(10진법 숫자 45를 3진법 숫자 1200으로 바꾸는 과정이다.)

 

[10진법->3진법]

 

그림에서 45를 3으로 나눈 몫(15)는 아래에, 나머지(0)은 왼쪽에 둔다. 몫을 3으로 다시 나눠서 나온 몫(5)는 아래에, 나머지(0)은 왼쪽에 둔다. 이와 같은 과정을 반복한다.

 

3. 124나라는 1은 1, 2는 2, 3은 4로 표현한다. 이것을 참고해 1200을 변환한다.

여기서 0은 어떻게 변환되는지 알 수 없다. 이 때 새로운 규칙이 도입된다.

 

새로운 규칙: 나머지가 0인 경우, 몫에서 1을 빼고, 나머지는 3으로 바꾼다.

 

새로운 규칙을 적용해 45라는 숫자를 변형하는 과정은 아래와 같다.

 

[10진법 -> 3진법+새로운 규칙]

 

4. 마지막으로 1123에서 3을 4로 바꾸면, 최종적으로 1124가 나온다.


제 CODE는 다음과 같습니다.

dic={1:'1',2:'2',3:'4',0:''}

n=45

s=[]

ss=''

 

while n>=3:

 

  if n%3==0 and (n//3==3 or n//3==2 or n//3==1):

    n=n//3-1

    s.append(3)

    s.append(n)

  elif n%3==1 and (n//3==2 or n//3==1):

    n=n//3

    s.append(1)

    s.append(n)

  elif n%3==2 and (n//3==2 or n//3==1):

    n=n//3

    s.append(2)

    s.append(n)

 

  elif n%3==0:

    n=n//3-1

    s.append(3)

  elif n%3==1:

    n=n//3

    s.append(1)

  elif n%3==2:

    n=n//3

    s.append(2)  

 

while s:

  ss+=dic[s.pop()]

ss

+ Recent posts