출처: [이것이 취업을 위한 코딩테스트다 - 나동빈 저](https://ridibooks.com/books/443000825
배너: godori님이 만드신 배너 메이커 활용
print()
, input()
과 같은 기본 입출력 기능부터 sorted()
와 같은 정렬 기능을 포함하는 내장 라이브러리.sum()
: iterable 객체가 입력으로 주어졌을 때, 모든 원소의 합을 반환한다.max()
: 파라미터가 2개 이상 들어왔을 때 가장 큰 값을 반환한다.min()
: 파라미터가 2개 이상 들어왔을 때 가장 작은 값을 반환한다.eval()
: 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환한다.sorted()
: iterable 객체가 들어왔을 때, 정렬된 결과를 반환한다.eval()
사용 예시 소스코드result = eval("(2 + 4) * 6")
print(result)
36
sorted()
사용 예시 소스코드result = sorted([9, 3, 2, 7, 4]) # 오름차순으로 정렬
print(result)
result = sorted([9, 3, 2, 7, 4], reverse = True) # 내림차순으로 정렬
print(result)
[2, 3, 4, 7, 9]
[9, 7 ,4, 3, 2]
파이썬에서 리스트의 원소로 리스트나 튜플이 존재할 때 특정한 기준에 따라서 정렬을 수행할 수 있다.
정렬 기준은 key 속성을 통해 명시한다.
리스트에 튜플이 원소로 있을 때, 이를 튜플의 두 번째 원소를 기준으로 내림차순 정렬하는 예시
result = sorted([('박성재', 27), ('김프론', 33), ('이서버', 42)], key = lambda x: x[1], reverse = True)
print(result)
[('이서버', 42), ('김프론', 33), ('박성재', 27)]
리스트와 같은 iterable 객체는 기본으로 sort()
함수를 내장하고 있어서 굳이 sorted()
함수를 사용하지 않아도 정렬할 수 있다. 이 경우 리스트 객체의 내부 값이 정렬된 값으로 바로 변경된다.
sort()
함수 예시 소스코드data = [9 ,3, 2, 5, 6]
data.sort()
print(data)
[2, 3, 5, 6, 9]
itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리다.
제공하는 클래스는 매우 다양한지만, 코딩 테스트에서 가장 유용하게 사용할 수 있는 클래스는 다음과 같다.
모두 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하여(or 고려하지 않고) 중복을 허용하여(or 허용하지 않고) 나열하는 모든 경우를 계산한다.
모두 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations, combinations, product, combinations_with_replacement
data = ['A', 'B', 'C'] # 데이터 준비
result = list(permutations(data, 3)) # 모든 순열 구하기
print(result)
result = list(combinations(data, 2)) #2개를 뽑는 모든 조합 구하기
print(result)
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복 허용)
print(result)
result = list(combinations_with_replacement(data, repeat=2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)
print(result)
#3개를 뽑는 순열
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
#2개를 뽑는 조합
[('A', 'B'), ('A', 'C'), ('B', 'C')]
#2개를 뽑는 중복허용 순열
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
#2개를 뽑는 중복허용 조합
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
heap.heappush()
메서드를 사용heap.heappop()
메서드를 사용improt heapq
def heapsort(iterable):
h = []
result = []
# 모든 우너소를 차례대로 힙에 삽입
for value in iterable:
heapq.push(h, vlaue)
# 힙에 삽입된 모든 원소를 차례대로 꺼내서 담기
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
파이썬에서는 최대 힙을 제공하지 않기 때문에, heapq 라이브러리를 이용해서 최대 힙을 구현해야 할 때는 원소의 부호를 임시로 변경하는 방식을 사용한다.
힙에 원소를 삽입하기 전에 잠시 부호를 반대로 바꾸었다가, 힙에서 원소를 꺼낸 뒤에 다시 원소의 부호를 바꾸면 된다.
import heapq
def heapsort(iterable):
h = []
result = []
# 모든 원소를 차례대로 힙에 삽입 (부호 반대로)
for value in iterable:
heapq.heappush(h, -value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기 (부호 다시 뒤집어서)
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
bisect_left()
와 bisect_right()
함수가 가장 중요하게 사용되며, 이 두 함수가 동작하는 시간 복잡도는 O(logN)이다.bisect_left(a, x)
: 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드bisect_right(a, x)
: 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x))
print(bisect_right(a, x))
2
4
위 두 함수는 '정렬된 리스트'에서 '값이 특정 범위에 속하는 원소의 개수'를 구하고자 할 때, 효과적으로 사용될 수 있다. 시간복잡도는 O(logN)이다.
from bisect import bisect_left, bisect_right
# 값이 [left_vlaue, right_value] 범위에 속하는 데이터의 개수를 반환하는 함수
def count_by_range(a, left_value, right_value):
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index - left_index
# 리스트 선언
a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
# 값이 4인 데이터 개수 출력
print(count_by_range(a, 4, 4)
# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3)
2
6
deque는 데이터의 맨 앞과 맨 뒤 모두에서 삽입과 삭제가 가능하기 때문에 스택으로도 쓸 수 있고, 큐로도 쓸 수 있다.
popleft()
로 맨 앞 원소 제거, append(x)
로 맨 뒤에 원소 x 삽입pop()
로 맨 뒤 원소 제거, append(x)
로 맨 뒤에 원소 x 삽입appendleft(x)
from collections import deque
data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)
print(data)
print(list(data)) # 리스트 자료형으로 변환
data.popleft()
data.pop()
print(list(data))
deque([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]
[2, 3, 4]
from collections import Counter
counter = Counter(['red', 'blue', 'red' ,'green', 'blue', 'blue'])
print(counter['red']) # 'red'가 등장한 횟수 출력
print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(dict(counter)) # 딕셔너리형으로 변환
2
3
{'red': 2, 'blue': 3, 'green': 1}
factorial(n)
: n!sqrt(x)
: x의 제곱근gcd(a, b)
: a와 b의 최대 공약수import math
print(math.factorial(5)) # 5 팩토리얼
print(math.sqrt(6)) # 6의 제곱근 출력
print(math.gcd(35, 14))
print(math.pi)
print(math.e)
120
2.449489742783178
7
3.141592653589793
2.718281828459045
공부하는데 많은 도움이 됐습니다.