코딩테스트를 위한 파이썬 문법 (7) (bisect, collections, math)

janeljs·2020년 11월 27일
13

Python

목록 보기
8/9
post-thumbnail

이 포스팅은 이것이 취업을 위한 코딩테스트다 APPENDIX A 코딩테스트를 위한 파이썬 문법 파트를 읽고 공부한 내용을 정리하는 용도로 작성되었습니다.
APPENDIX A에 수록된 문법 외에 개인적으로 공부한 내용을 추가해 두었으며, 예제는 직접 연습하며 작성하였기에 교재와 다를 수 있습니다.

bisect

이진 탐색(Binary Search) 기능을 제공하는 표준 라이브러리

  • 정렬된 배열에서 특정한 원소를 찾아야 할 때 사용

bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
bisect_right(a, x): 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
→ 두 메서드 모두 시간 복잡도 O(logN)O(logN)에 작동한다.

  • 예제 1
from bisect import bisect_left, bisect_right

a = [1, 2, 3, 3, 3, 5, 5, 7]
print(bisect_left(a, 3))
print(bisect_right(a, 3))
print(bisect_left(a, 5))
print(bisect_right(a, 5))
# result
2 
5
5
7
  • 예제 2: 값이 특정 범위에 속하는 원소의 개수 구하기
a = [1, 2, 3, 3, 3, 5, 5, 7]
def count_by_range(a, left_value, right_value):
    right_idx = bisect_right(a, right_value)
    left_idx = bisect_left(a, left_value)
    return right_idx - left_idx

print(count_by_range(a, 3, 3)) # 3의 개수
print(count_by_range(a, 2, 5)) # 2 이상 5 이하인 수 
# result
3
6

collections

deque, Counter 등 유용한 자료구조를 제공하는 표준 라이브러리

deque: 양쪽 끝에서 빠르게 추가(append)와 삭제(pop)를 할 수 있는 리스트류 컨테이너
Counter: hashable object를 세는 데 사용하는 딕셔너리 서브 클래스, element는 dictionary key로 저장되고, 개수는 dictionary value로 저장된다.

deque

  • 파이썬에서는 queue를 구현할 때 보통 deque를 이용한다.
  • 리스트와 다르게 인덱싱, 슬라이싱이 불가하다.
  • 시작 또는 끝 부분에 데이터를 삽입하거나 삭제할 때 효과적이다.
  • 스택이나 큐의 기능을 모두 갖추고 있기 때문에 스택이나 큐 대용으로 사용될 수 있다.
    → 큐로 이용하고 싶은 경우 삽입 시에는 append(), 삭제 시에는 popleft()를 사용하면 된다.

deque 메서드

namedescription
pop()마지막 원소를 제거한 뒤 반환
popleft()첫 번째 원소를 제거한 뒤 반환
append(x)deque 오른쪽에 x 삽입
appendleft(x)deque 왼쪽에 x 삽입
clear()deque의 모든 원소를 제거
copy()deque의 shallow copy를 생성
count(x)x와 같은 deque element의 수 계산
  • 예제
from collections import deque

a = deque([1, 2, 3, 3, 3, 5, 5, 7])
a.appendleft(9)
a.append(10)

print(list(a))
# result
[9, 1, 2, 3, 3, 3, 5, 5, 7, 10]

시간복잡도

listdeque
가장 앞쪽에 원소 추가O(N)O(N)O(1)O(1)
가장 뒤쪽에 원소 추가O(1)O(1)O(1)O(1)
가장 앞쪽에 있는 원소 제거O(N)O(N)O(1)O(1)
가장 뒤쪽에 있는 원소 제거O(1)O(1)O(1)O(1)

Counter

  • 리스트와 같은 iterable object가 주어졌을 때 해당 객체 내부의 원소가 몇 번 등장했는지 알려준다.
  • 예제
from collections import Counter

counter = Counter(['🍍', '🍎', '🍍', '🍇', '🍎', '🍎', '🍍', '🍎'])

print(counter)
print(counter['🍍'])
print(counter['🍎'])
print(counter['🍇'])
print(dict(counter))
# result
Counter({'🍎': 4, '🍍': 3, '🍇': 1})
3
4
1
{'🍍': 3, '🍎': 4, '🍇': 1}

math

자주 사용되는 수학적인 기능을 포함하고 있는 표준 라이브러리

  • factorial(x) 메서드: x! 값을 반환
import math
print(math.factorial(5))
# result: 120
  • sqrt(x) 메서드: x의 제곱근을 반환
import math
print(math.sqrt(5))
# result: 2.23606797749979
  • gcd(a, b) 메서드: a와 b의 최대 공약수를 반환
import math
print(math.gcd(5, 15))
# result: 5

드디어 코딩테스트를 위한 파이썬 문법 시리즈가 끝났어요! 👏👏👏
다음 포스팅에서는 학습한 문법을 바탕으로 codeup 기초 100제를 푼 뒤 새롭게 알게 된 점을 정리해서 공유드릴게요😃
코딩테스트 준비 시리즈가 조금이나마 도움이 되셨다면 💚 부탁드려요💞


Source

3개의 댓글

comment-user-thumbnail
2020년 12월 11일

좋은 정보 감사합니다!! ㅎㅎ

1개의 답글
comment-user-thumbnail
2020년 12월 15일

Thanks a lot for sharing!JOKER123

답글 달기