코딩테스트에 필요한 파이썬 문법 정리
개인적으로 헷갈리거나 자주 까먹는 문법들을 정리해놓았다.
너무 뻔한건 안썼음.
숫자
컴퓨터는 2진법을 사용하므로 실수형은 정확한 계산이 되지 않는다.
소숫점 5째 자리 이전에 반올림 해줘야 된다.
round는 그냥 하나로 쓰면 정수형이 나오지만 뒤에 소수 자리 파라미터를 넣으면 실수형으로 나온다.
리스트 메소드
메소드 | 역할 | 예시 | 시간복잡도 | 비고 |
insert() | 특정 위치에 원소 삽입 | a.insert(1, 2) # a[1]에 숫자 2 삽입 a.insert(3, [1,2]) # a[3]에 리스트 삽입 |
O(N) | 삽입 위치에 따름 |
append() | 맨 뒤에 원소 삽입 | a.append(3) | O(1) | |
extend() | 리스트 병합 | test1 = [1, 2, 3] test2 = [4, 5, 6] test1.extend(test2) # [1, 2, 3, 4, 5, 6] |
O(N) | 확장 길이에 따름 |
clear() | 리스트 내용 삭제 | a.clear() | O(1) | |
index() | 파라미터의 인덱스 | a = [1,2,3] a.index(3) # 2 |
O(N) | 없으면 에러 |
pop() | 리스트 마지막 내용 반환 후 삭제 |
a = [1, 2, 3] a.pop() # 3, a=[1,2] |
O(1) | pop(0) 은 O(n) |
del | 특정 위치의 원소 삭제 | a = [1, 2, 3] del a[1] # a = [1, 3] |
O(N) | |
remove() | 특정 원소 삭제 | a = [1, 2, 3] a.remove(3) # a = [1, 2] |
O(N) | |
copy() | 값 복사 | a = [1, 2, 3] b = a.copy() |
O(N) | a[:] 과 같다. 2차원 배열은 얕은복사됨. |
in/ not in | 포함 유무 검색 | if 3 in [1, 2, 3]: # True | O(N) | 검색 |
== | 두 리스트 비교 | list1 == list2 | O(N) | |
list() | 리스트로 변환 | list(object) | O(N) | 리스트 길이에 따름 |
len() | 리스트 길이 반환 | len(list) | O(1) | |
min()/max() | 최소값/최대값 반환 | max(li) min(li) | O(N) | |
sort() | 리스트 정렬 | a.sort() a.sort(reverse=True) |
O(NlogN) | |
sorted() | 정렬된 리스트 반환 | sorted(a) sorted(a, reverse=True) |
O(NlogN) | |
reverse() | 리스트 역순 | a = [1, 4, 2, 3] a.reverse() # [3, 2, 4, 1] |
O(N) | a[::-1]과 유사 |
count() | 요소 개수 카운팅 | a = [1, 1, 1, 2, 3, 3] a.count(1) # 3 |
O(N) |
딕셔너리
메소드 | 역할 | 예시 | 시간복잡도 | 비고 |
len() | 길이 반환 | len(dict1) | O(1) | |
del | 요소 삭제 | del dict1[key] | O(1) | |
pop() | 요소 반환 후 삭제 | dict1.pop(key) | O(1) | 파라미터 필요 |
popitem() | 마지막 요소 반환후 삭제 | dict1.popitem() | O(1) | 파라미터 불필요 |
clear() | 딕셔너리 초기화 | dict1.clear() | O(1) | |
keys() | 딕셔너리 키들의 집합 | dict1.keys() | O(1) | |
values() | 딕셔너리 값들의 집합 | dict1.values() | O(1) |
튜플
수정이 안되는 리스트. 마지막에 꼭 ,를 넣어주어야 한다.
다익스트라 알고리즘, 그래프 알고리즘 구현에 사용
셋
중복이 없는 튜플. 순서 x.
문자열
문자열 슬라이싱은 [시작 인덱스:끝 인덱스(포함안됨):증감값]으로 한다
형변환
함수 | 역할 | 예시 |
int() | 문자열 또는 n진수를 10진수 숫자로 변경 | int('45'), int(0xff) # 255 |
str() | 파라미터를 문자로 변경 | str(23), str([1.2]) # '[1, 2]' |
bin() | 숫자를 2진수로 변경 | bin(2) # 0b10 |
oct() | 숫자를 8진수로 변경 | oct(2) # 0o2 |
hex() | 숫자를 16진수로 변경 | oct(2) # 0x2 |
list() | 파라미터를 배열로 변경 | list('123') # ['1', '2', '3'] |
''.join(list) | 리스트를 문자열로 변경 | ''.join(['1','2','3']) # "123". 모든 변수가 문자열이어야 됨 |
3항 연산자
a = 참일때 값 if 조건 else 거짓일 때 값
람다 표현식
보통 정렬할 때 많이 사용한다.
우선순위 설정도 가능. (첫번째 기준이 같은 경우 두번째 기준으로 판단)
기준 앞에 -를 붙이면 역순으로 정렬도 가능하다. (기준이 문자열이면 안통함)
라이브러리
itertools
반복적인 데이터 처리 기능을 제공하는 라이브러리
반환되는 값은 리스트 자료형으로 초기화 해야 사용할 수 있다.
메소드 | 기능 | 예시 |
itertools.permutations(데이터, 개수(r)) | 순열 nPr | data = ['a', 'b', 'c'] itertools.permutations(data, 3) |
itertools.combinations(데이터, 개수(r)) | 조합 nCr | data = ['a', 'b', 'c'] itertools.combinations(data, 2) |
itertools.product(데이터, repeat=개수) | 중복 가능한 순열 | data = ['a', 'b', 'c'] itertools.product(data, repeat=2) |
itertools.combinations_with_replacement() | 중복 가능한 조합 | data = ['a', 'b', 'c'] itertools.combinations_with_replacement(data, 2) |
collections
카운터와 덱을 제공하는 라이브러리
deque
메소드 | 기능 | 예시 |
que.append() | 원소 추가 | que.append(1) |
que.popleft() | 맨 앞의 원소를 반환 후 삭제 | que.popleft() |
que.pop() | 맨 뒤의 원소를 반환 후 삭제 | que.pop() |
len() | 큐의 길이 반환 | len(que) |
counter
등장 횟수를 세는 기능
리스트나 딕셔너리, 셋 등으로 변환해서 사용할 수 있다.
math
수학적 기능을 가지는 라이브러리
메소드 | 기능 | 에시 |
math.factorial(n) | 팩토리얼 | math.factorial(5) |
math.sqrt(n) | 제곱근 | math.sqrt(4) |
math.gcd(a, b) | a와 b의 최대공약수 | math.gcd(5, 2) # 1 |
math.lcm(a, b) | a와 b의 최소공배수 | math.lcm(3, 10) # 30 |
math.pi | 원주율 파이 | math.pi |
math.e | 자연상수 e (2.72...) | math.e |
math.ceil(x) | x를 자연수로 올림 | math.ceil(2.1) # 3 |
math.floor(x) | x를 자연수로 내림 | math.floor(2.9) # 2 |
math.log(x[, base]) | x를 base를 밑으로 하는 로그 | math.log(4, 2) # 2.0 |
heapq
힙 기능을 제공하는 라이브러리
다익스트라 최단경로 알고리즘 등에서 우선순위 큐를 구현하고자 사용
최소 힙 으로 구성돼 있으므로 넣었다 빼는 것만으로도 O(NlogN)에 오름차순 정렬이 완료된다.
(최상단 원소가 가장 작은 수)
heapq.heappush(배열, 값) : 힙으로 쓸 배열에 원소를 넣는다.
heapq.heappop(배열) : 힙으로 쓰는 배열에서 최상위 원소를 꺼낸다.
넣었다 빼는 것 만으로도 힙정렬을 구현할 수 있다.
최소 힙인 점을 이용해 -를 이용하면 역정렬도 구현할 수 있다.
bisect
이진탐색 라이브러리
정렬된 배열에서 특정 원소를 찾을 때 특화 돼있다.
bisect_left(a, x) : 정렬된 순서를 유지하며 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스
bisect_right(a, x) : 정렬된 순서를 유지하며 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스
보통 정렬된 리스트에서 특정 범위 내의 원소의 개수를 구할 때 사용