💡 코딩 테스트 준비를 위한 문제를 풀면서, 신기하고 유용한 메소드를 정리해보자
n = -37
bin(n) # -0b100101
n.bit_length() # 6
부호와 선행 0을 제외하고, 이진수로 정수를 나타내는 데 필요한 비트 수를 돌려줍니다:
x 가 0이 아니면, x.bit_length() 는 2^(k-1) <= abs(x) < 2^k 를 만족하는 유일한 양의 정수 k 입니다.
동등하게, abs(x) 가 정확하게 반올림된 로그값을 가질 만큼 아주 작으면, k = 1 + int(log(abs(x), 2)) 가 됩니다.
x 가 0이면, x.bit_length() 는 0 을 돌려줍니다.
n = 19
bin(n) # 0b10011
n.bit_count() # 3
정수 절대값의 이진 표현에서 1의 총 개수를 반환
citations = [9,6,5,1]
answer = max(map(min, enumerate(citations, start=1)))
map함수는 기존 자료형을 바꾸는 용도로만 사용했는데, 위와 같이도 사용이 가능하다.
1. enumerate(citations, start =1)
start=1 옵션을 줘서, 시작 index를 1로 설정해서 index와 value 도출
2. map(min,enumerate(citations, start=1))
map을 통해서 분류할 기준을 min으로 잡을 수 있다. 그럼 (index,value) 중 작은 값만 도출
def solution(progresses, speeds):
Q=[]
for p, s in zip(progresses, speeds):
if len(Q)==0 or Q[-1][0]<-((p-100)//s):
Q.append([-((p-100)//s),1])
else:
Q[-1][1]+=1
return [q[1] for q in Q]
zip()는 반복하며, 넣은 2가지 배열의 원소를 하나씩 가져와서 넣어주는 메소드이다. ( 단 길이가 다르다면 작은쪽에 맞춰짐 )
ex) progresses = [0,1,2] / sppeds = [A,B] => [0,A], [1,B]
+) 추가적으로 math.ceil 방식을 사용하지 않고, 올림을 하는 방법이 제시되었다.
음수로 만들어서 나누기를 하면 자동으로 내림이 되는 것을 이용해서 올림 사용
ex) -3 // 2 = -2 ( 내림이 됨) => 3//2 올림 구하고 싶으면 -(-3//2)로 구하면 올림이 가능하다 👍🏻
def solution(clothes):
from collections import Counter
from functools import reduce
cnt = Counter([kind for name, kind in clothes])
answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
return answer
reduce 메소드는 lambda를 사용해서, 함수를 계산해주는 메소드이다.
reduce(function, iterable, 초기값)으로 선언된다.
reduce(lambda x, y: x*(y+1), cnt.values(), 1) -1
이 경우에는 x의 초기값은 1 ( 곱셈의 경우는 1, 덧셈의 경우는 0)
y는 cnt.values()가 돌면서 하나씩 들어감
x*(y+1)의 결과값은 x에 들어감
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
any 메소드는 iterable 객체 안에 값이 하나라도 True에 해당하는 값이 있으면 True, 없으면 False를 반환한다.
따라서 위와 같은 경우, queue를 전체 순회하면서 cur[1] < q[1]이면, 즉, 현재 값보다 큰 값이 존재하면, append를 해준다.
pro = [(1,1), (5,2), (3,3)]
max_pro = max(pro, key=lambda x: x[1]) # (3,3)
max_pro = max(pro) # (5,2)
max 메소드 역시, key를 통해서 최댓값을 판단하는 기준을 지정할 수 있다.
위 코드를 참고하면, pro가 [(a,b)]로 되어있을때, 기존 max(pro)는 a를 기준으로 최댓값을 찾는다.
따라서 , key=lambda x: x[1]로 설정해주면 b를 기준으로 최댓값을 찾을 수 있다.
x, n = 14, 3
q, r = divmod(x, n) # (4,2)
divmod(a,b) 메소드는 a // b, a % b 값을 모두 반환해주며, (a // b, a % b)의 형태로 반환해준다.
실제로 진수를 계산할 경우, 직접 q = x//n와 같은 방식 없이 위 같은 방식을 많이 사용하기 때문에 알아두도록 하자!!