문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
📌 문제 이해
자연수 n을 3진법으로 변환한 뒤 앞뒤로 뒤집고, 뒤집힌 값을 다시 10진법으로 변환하는 문제이다.
예를 들어 n = 45인 경우 다음과 같은 과정을 거친다.
45 (10진법)
↓
1200 (3진법)
↓
0021 (앞뒤 반전)
↓
7 (10진법)
💡 풀이 과정
1. 10진수를 3진수로 변환하기
10진수를 3진수로 변환하기 위해서는 숫자를 3으로 계속 나누면서 나머지를 구한다.
45를 예시로 계산하면 다음과 같다.
45 ÷ 3 = 15 ... 나머지 0
15 ÷ 3 = 5 ... 나머지 0
5 ÷ 3 = 1 ... 나머지 2
1 ÷ 3 = 0 ... 나머지 1
나머지가 나온 순서는 다음과 같다.
0 → 0 → 2 → 1
일반적으로 3진수를 구할 때는 나머지를 아래에서 위로 읽기 때문에 1200이 된다.
하지만 이번 문제에서는 3진수를 다시 앞뒤로 뒤집어야 한다.
1200 → 0021
따라서 나머지가 나온 순서인 0021을 그대로 저장하면 3진수를 변환하고 뒤집는 과정을 한 번에 처리할 수 있다.
2. 나머지를 문자열에 저장하기
answer += str(n % 3)
n % 3을 통해 3으로 나눈 나머지를 구한다.
answer는 문자열이므로 str()을 사용하여 나머지를 문자로 변환한 뒤 순서대로 저장한다.
answer = ""
45 % 3 = 0 → answer = "0"
15 % 3 = 0 → answer = "00"
5 % 3 = 2 → answer = "002"
1 % 3 = 1 → answer = "0021"
최종적으로 answer에는 **뒤집힌 3진수인 "0021"**이 저장된다.
3. 숫자를 3으로 계속 나누기
n //= 3
//는 나눗셈의 몫만 구하는 연산자이다.
45 → 15 → 5 → 1 → 0
while n > 0 조건을 사용하여 n이 0이 될 때까지 반복한다.
4. 뒤집힌 3진수를 다시 10진수로 변환하기
int(answer, 3)
int(값, 진법)을 사용하면 특정 진법의 값을 10진수로 변환할 수 있다.
int("0021", 3)
0021을 3진법 숫자로 계산하면 다음과 같다.
0 × 3³
+ 0 × 3²
+ 2 × 3¹
+ 1 × 3⁰
= 0 + 0 + 6 + 1
= 7
따라서 최종 결과는 7이 된다.
💻 최종 코드
def solution(n):
answer = ""
while n > 0:
answer += str(n % 3)
n //= 3
return int(answer, 3)
✏️ 오늘 배운 점
이번 문제를 통해 10진수를 다른 진법으로 변환할 때 나눗셈의 나머지를 활용할 수 있다는 점을 배웠다. 특히 3으로 나눈 나머지가 역순으로 생성된다는 특징을 이용하면 별도의 뒤집기 과정 없이 문제를 해결할 수 있다는 점이 인상적이었다.
또한 int(answer, 3)처럼 int() 함수의 두 번째 인자에 진법을 지정하면 해당 진법의 문자열을 간단하게 10진수로 변환할 수 있다는 점도 새롭게 알게 되었다.
태블로를 새롭게 배우게 되었는데 강의 초반부분을 들었는데 너무 재밌고 흥미로웠다