프로그래머스 연습 문제
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
3진법 수 표현: 몫이 0이 될 때까지 숫자를 3으로 나누고 나머지를 정렬한다.
e.g.) 45를 3진법 한 수: 1200
def solution(n):
n3 = ''
while n > 0 :
n3 += str(n % 3)
n //= 3
n10 = int(n3, 3)
return n10
n3 = ''
: 3진법으로 표현한 n을 저장할 변수를 만든다. 진법을 바꾸는 과정에서는 숫자들의 순서가 중요하다. 0을 숫자로 인식해 0 값이 사라지는 것을 방지하기 위해 문자열로 만든다.
while n > 0 :
: n이 0이 될 때까지 반복한다.
이 상황에서는 while n
이나 while n != 0
으로도 표현할 수 있다.
n3 += str(n % 3)
: n을 3진법으로 표현하기 위한 과정. n을 3으로 나눈 나머지를 n3에 추가한다. 이 과정에서 결과값이 숫자이기 때문에 str()을 이용하여 문자열로 변환 후 넣어준다.
계산되는 값이 뒤에 누적해서 추가되므로 n을 3으로 나눈 나머지 값이 순서대로 저장된다.
n3 += str(n % 3)과 n3 = str(n % 3) + n3의 차이
e.g.)
n = 45
n3 += str(n % 3) 은 str(n % 3)을 뒤에 추가하는 방식.
→ '0021'
n3 += str(n % 3) 🟰 n3 = n3 + str(n % 3)
n3 = str(n % 3) + n3 은 str(n % 3)을 앞에 추가하는 방식.
→ '1200'
n //= 3
: n을 3으로 나눈 몫을 다시 n에 할당한다.
n // = 3 이라고 표현하면 신택스 오류 발생!
연산자 사이에는 띄어쓰기를 하면 안 된다.
n10 = int(n3, 3)
: 3진수 문자열을 10진수 정수로 변환하여 n10 변수에 담는다.
int 함수는 문자열/실수를 정수형으로 바꿔주는 기능만 하는 줄 알았는데 다른 진법의 숫자를 10진수로 바꿔줄 때도 사용한다!!
int(string, base)
: 각 base 진법을 10진법으로 바꿔준다.
def solution(n):
answer = 0
cnt = 1
a = ''
while n>0:
a+=str(n%3)
n = n//3
print(a)
for b in range(len(a),0,-1):
answer += (int(a[b-1])*cnt)
cnt *= 3
return answer
n10 = int(n3, 3)
부분을 for 문으로 표현했다.
for b in range(len(a),0,-1):
:
: 코드 내에서 a는 n을 3진수로 표현한 값이다.
a의 길이를 범위로 하여 역순으로 조회한다. 변수 b를 이용해 a의 마지막 숫자부터 첫 번째 숫자까지 순서대로 조회한다.
answer += (int(a[b-1])*cnt)
: 3진수 n값이 문자열이므로 인덱싱을 할 수 있다.
int(a[b-1])
부분으로 조회 중인 자리의 문자열 숫자를 정수형으로 바꾼다.
cnt *= 3
: 10진수 숫자의 3진수 값은 숫자를 3으로 나누어서 계산하는 것이므로, 3진수 숫자를 10진수 값을 구하기 위하여 3을 곱한다.