Computer Knowledge/코테 대비 오답노트
[python] 2의 n제곱인지 확인
l._.been
2023. 5. 20. 15:41
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/181857
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
2의 제곱수인지 확인하는 법
- 2는 비트로 나타냈을 때: 1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000, 16 = 1 0000, 32 = 11 0000, 64 = 100 0000 ...
- 2의 제곱수 규칙: 왼쪽에 1이고 나머지는 0임
- 만약 n을 2의 제곱수라고 했을 때, 이전 값인 n-1과 곱하게 되면 맨 왼쪽 수는 0이 된다.
- 2의 제곱수인지 알고 싶다면 n&(n-1)해서 0인지 확인하면 됨
def solution(arr):
n = len(arr)
li = [ 2**i for i in range(30)]
if n&(n-1)==0:
return arr
else:
cnt = 0
for i in li:
if i > n:
cnt = i
break
for i in range(cnt-n):
arr.append(0)
return arr
인상적인 풀이
def solution(arr):
n = len(arr)
if n & (n - 1) == 0:
return arr
m = 1
while m < n:
m <<= 1
return arr + [0] * (m - n)
진짜 깔끔하다.
만약 2의 제곱수가 아니라면
m이라는 변수에 1부터 2,4,8,16... 으로 2의 제곱수가 되게하면서,
n보다 커질때까지 2의 제곱이 된다.
그렇게 구해진 m에 배열의 길이를 제외하여 뒤에 붙여야될 0의 갯수를 구함;;
대단...
참고로
비트 연산자(Bitwise Operators)는
&(and), |(or), ^(xor), ~(not), <<(왼쪽 비트단위 밀기), >>(오른쪽 비트단위 밀기)가 있다.