반응형
프로그래머스의 Level 01 월간 코드 챌린지 시즌1의 3진법 뒤집기프로그래머스의 Level 01 월간 코드 챌린지 시즌1의 3진법 뒤집기 문제입니다.
문제
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한 조건
- n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예
n | result |
45 | 7 |
125 | 229 |
입출력 예 설명
입출력 예 #1
- 답을 도출하는 과정은 다음과 같습니다.
n(10진법) | n(3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
45 | 1200 | 0021 | 7 |
- 따라서 7을 return 해야 합니다.
입출력 예 #2
- 답을 도출하는 과정은 다음과 같습니다.
n(10진법) | n(3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
125 | 11122 | 22111 | 229 |
- 따라서 229를 return 해야 합니다.
풀이
두 가지 풀이과정을 생각할 수 있습니다.
- 10진법인 n(45)를 3진법인 0021으로 변경을 해줍니다.
- 10진법인 숫자를 n진법으로 변경을 하려면 몫이 0이 될 때까지 해당 진법의 숫자로 나눠주면 됩니다.
- python에서 divmod()를 사용하면 튜퓰 형태로 몫, 나머지를 얻을 수 있습니다.
- divmod(7, 3) => (2, 1)
- 3진법인 0021을 10진법으로 변경을 해줍니다.
- 3진법인 숫자를 10진법으로 변경을 하려면 첫 번째 자리는 1을 곱하고 두 번째 부터는 3^n을 곱해주면 됩니다.
- python에서 int() 연산자를 n진법의 숫자를 10진법의 숫자로 손쉽게 변경이 가능합니다.
- int('0011', 2) => 3
첫 번째 풀이
- 5~10행 : divmod()를 사용해서 몫과 나머지를 구하고 나머지가 0이 될 때까지 three라는 문자열에 나머지를 추가해줍니다.
- 13행 : 현재 three문자열에 "0021"이 있다면, for문의 시작 숫자는 len("0021")-1 => 3이고, 끝 숫자는 -1, 증감 숫자는 -1로써, 3부터 0까지 -1씩 가감하는 것입니다.
- 해당 문자열에 끝에서 부터 접근하기 위해서 for문의 가감 연산자를 사용했습니다.
def solution(n):
answer = 0
three = ''
while True:
n,remainder = divmod(n, 3)
three += str(remainder)
if n == 0:
break
multi = 3
for t in range(len(three)-1, -1, -1):
if t == len(three)-1:
answer = int(three[t]) * 1
continue
answer = answer + int(three[t]) * multi
multi *= 3
return answer
두 번째 풀이
- 12행 : 다른 부분의 위와 모두 같지만, int(three, 3)을 이용해서 int('0021', 3) => 3진법인 0021을 10진법으로 손쉽게 변경해주는 int()를 사용했습니다.
def solution(n):
answer = 0
three = ''
while True:
n,remainder = divmod(n, 3)
three += str(remainder)
if n == 0:
break
return int(three, 3)
반응형
'코딩테스트 > Programmers' 카테고리의 다른 글
[Programmers][Python][Level 1] 내적 (0) | 2021.04.18 |
---|---|
[Programmers][Python][Level 1] 음양 더하기 (0) | 2021.04.18 |
[Programmers][Python][Level 1] 예산 (0) | 2021.04.18 |
[Programmers][Python][Level 1] 소수 만들기 (0) | 2021.04.17 |
[Programmers][Python][Level 1] 같은 숫자는 싫어 (0) | 2021.04.16 |
[Programmers][Python][Level 1] 가운데 글자 가져오기 (0) | 2021.04.16 |
[Programmers][Python][Level 1] K번째수 (0) | 2021.04.15 |
[Programmers][Python][Level 1] 2016년 (0) | 2021.04.15 |