-
[Python] 프로그래머스 : 3진법 뒤집기코딩테스트/프로그래머스 2024. 7. 18. 14:12
[문제 풀기 전 생각한 부분]
1. 10진법에서 3진법으로 어떻게 변환되나?
2. n 을 3으로 나눈 나머지를 문자열 형태로 저장한 뒤 뒤집으면 된다.
3. 저장한 문자열의 길이만큼 순회해서 곱하고 더해준다.
[my_code]위 2번을 생각해볼 때 문자열을 따로 뒤집을 필요가 없다. 문자열을 저장할 때, 뒤집지 않아도 거꾸로 들어간다.
n = 45 rest = '' while n > 0: rest += str(n % 3) n = n // 3 print(rest) # 0021
10진법에서 3진법으로 어떻게 바꿀 수 있을까?
- 구현한 코드부터 보자 !
n = 45 rest = '' while n > 0: rest += str(n % 3) n = n // 3 number = 0 # print(len(rest)) # 길이는 4 for i in range(len(rest)): number += int(rest[i]) * (3 **(len(rest) - 1 - i)) print(number)
- 위에서 아래로 설명하겠습니다.
- n과 rest를 초기화해준다. ( n이라는 박스에 정수 45를 넣고, rest 란 상자에 빈문자열을 만들어 준다고 생각하세요.)
- rest를 문자열로 초기화한 이유 : 문제와 비슷하게 하고 싶기 때문이다. 사실 제 풀이로는 list 로 초기화 해도 상관 없습니다.
- while문 사용 이유 : n에 어떤 숫자가 들어갈 지 알면 정확한 반복 횟수를 넣을 수 있겠지만, n에 어떤 숫자가 들어갈지 모르기 때문에 while문을 사용해서 n > 0을 만족하는 경우에만 반복 하도록 하였습니다.
- while 문의 n은 2가지 의미를 갖는다. 처음 들어온 값. 그 뒤로는 몫의 역할을 합니다.
- rest 에 n 을 3 으로 나눈 나머지를 차례로 저장합니다.
- n = n // 3 은 n //= 3과 같은 의미를 가집니다. n //= 3 을 통해 while 문이 반복되면서 n 값이 n을 3으로 나눈 몫으로 업데이트 됩니다. ex) 45 // 3 = 15(=n), 15 // 3 = 5(=n) ,....
- 최종 결과를 넣을 number를 초기화 합니다.
- 주석에서 봤듯이 rest의 길이는 4 입니다.
- for i in range(len(rest)) 는 rest의 길이 4만큼 반복. 즉, 4번 반복한다는 말입니다. 이 때 i 는 0,1,2,3 의 값을 가집니다.
- range(len(rest)) 를 사용한 이유는 인덱스의 특징이 0부터 시작하기 때문에 그렇게 사용했습니다.
- i = 0 일 때,
- number = number + int(rest[0]) * (3 ** (len(rest) - 1 - 0))
- 0 = 0 + 0 * ( 3 ** ( 4 - 1- 0 )
위 식을 잘 보고 이해하시기 바랍니다. ! 힌트를 드리자면..아래 참고... + number은 for문 안에서 계속 업데이트 됩니다.
우리가 평소 수학에서 쓰는 = 기호는 같다의 의미지만, 프로그래밍에서 = 의 의미는 오른쪽에 있는 값을 왼쪽에 대입한다고 생각하면 됩니다. ex) a = 10, 10을 a에 대입한다.
45 (10진법) -> 1200(3진법)
3 ** 3 + (3 ** 2) * 2 + (3 ** 1) * 0 + (3 ** 0) * 0 = 45
[다른 방법 찾아서 적용해보기]
# 몫과 나머지 구하는 방법 다르게 해보기. while n >= 0: n, re = divmod(n,3) answer += str(re)
충격이다. 근데 익숙하지 않아서 헷갈린다.
n = 45 rest = "" while n > 0: rest += str(n % 3) n = n // 3 number = int(rest, 3) print(number)
제일 충격이다. int 에 내장되어 있는 기능 뭐야..
base 확인 과 bit_length() 또한 알 수 있다.
https://codetorial.net/tips_and_examples/int_function.html < -블로그 참고'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 : 크기가 작은 부분문자열 (0) 2024.07.18 [Python] 프로그래머스 : 같은 숫자는 싫어 (0) 2024.07.17 [Python] 프로그래머스 : 최대공약수와 최소공배수 (0) 2024.07.17 [Python] 프로그래머스 : 핸드폰 번호 가리기 (0) 2024.07.16 [Python] 프로그래머스 : 제일 작은 수 제거하기 (0) 2024.07.16