[프로그래머스] LV 1. 3진법 뒤집기

김민철·2020년 11월 28일
0
post-thumbnail

푼 날짜 : 2020. 11. 14

문제

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

문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예

입출력 예 설명
입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.

따라서 7을 return 해야 합니다.
입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.

따라서 229를 return 해야 합니다.


내 풀이

10진법을 2진법으로 바꾸어본 적은 있지만, 코딩으로 바꿔본 적은 없었습니다. 심지어 3진법은 처음 접해보는 진법이였습니다.
아이패드로 여러 숫자를 3진법으로 바꿔보다 해답을 찾았습니다.

m 을 n 으로 나누면

m = 몫 * n + 나머지 로 표현이 가능합니다. 이제 몫을 n 으로 나눌 수 없을 때까지 나눠 보겠습니다.

m= 46 , n=3 인 예를 보겠습니다.
46 = 15 x 3 + 1
15 = 5 x 3
5 = 1 x 3 + 2

15 = (1 x 3 + 2) x 3
46 = (1 x 3 x 3 + 2 x 3) x 3 +1

즉, 46을 3진법으로 표현하면 1201 로 바꿀 수 있습니다.
'm = 몫 x n + 나머지' 형태의 식에서 몫과 나머지를 따로 리스트를 만들어 보겠습니다.

몫 = [15, 5, 1]
나머지 = [1, 0, 2]

마지막 몫이 3이 제일 많이 곱해지므로 3진법의 제일 앞 숫자가 되고 마지막 나머지가 두번째 숫자가 됩니다. 두번째, 첫번째 몫들은 3으로 나누어지기에 3진법에 들어가지 않고, 그들의 나머지는 3이 곱해지기에 3진법에 표시해줍니다.

몫[-1] 과 나머지들의 역순으로 10진법을 3진법으로 바꿀 수 있습니다. 이 방식은 다른 진법에도 동일합니다.

이 흐름을 코드로 나타내보겠습니다.

(첫 풀이)

첫 풀이에 통과했습니다.
10진법을 3진법으로 바꾼 값은 three 라는 문자열로 나타냈습니다.

(두 번째 풀이)
마지막 몫에 대해서 다시 살펴보겠습니다.
5 = 1 x 3 + 2
마지막 몫은 1이 였습니다.
1 = 0 x 3 + 1
위 식으로 보아, 마지막 몫은 나머지로도 나타낼수 있습니다.

그렇기에 몫들의 리스트를 만들지 않고, 나머지들의 리스트로 해결이 가능합니다.


다른사람 풀이

이 풀이는 a 라는 문자열로 나머지들을 바로 붙힙니다. while 문에서 '몫이 0보다 클때까지 반복한다' 라는 조건이 좋습니다. 저도 이 조건을 썼다면 if/break 을 추가할 필요가 없었습니다.

0개의 댓글