Data house
[python] 2의 n제곱인지 확인 본문
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), <<(왼쪽 비트단위 밀기), >>(오른쪽 비트단위 밀기)가 있다.
'Computer Knowledge > 코테 대비 오답노트' 카테고리의 다른 글
[python] - 그림 확대 (1) | 2023.05.20 |
---|---|
[python] 세개의 구분자 - re 정규식 (0) | 2023.05.20 |
[python] 부분문자열 - 역순 풀이, rindex( ), rfind( ) (0) | 2023.05.19 |
[python] 문자열 여러번 뒤집기 - slicing (0) | 2023.05.15 |
[python] 4개 숫자들 중 중복된 숫자마다 처리 - count(), index() (0) | 2023.05.14 |