파이썬 문법
리스트 컴프리헨션
# 0부터 9까지의 수를 포함하는 리스트
array = [i for i in range(10)]
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
# 1부터 9까지의 수들의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1, 10)]
so-리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용될 수 있다.
- 특히 N x M 크기의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용하다.
ㆍ좋은 예시 : array = [[0] * m for _ in range(n)]
- 만약 2차원 리스트를 초기화할 때 다음과 같이 작성하면 예기치 않은 결과가 나올 수 있다.
ㆍ잘못된 예시 : array = [[0] * m] * n
ㆍ위 코드는 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식된다.
리스트 관련 기타 메서드
함수명 | 사용법 | 시간 복잡도 |
append() | 변수명.append() | O(1) |
sort() | 변수명.sort() | O(NlogN) |
변수명.sort(reverse = True) | ||
reverse() | 변수명.reverse | O(N) |
insert() | insert(삽입할 위치 인덱스, 삽입할 값) | O(N) |
count() | 변수명.count(특정 값) | O(N) |
remove() | 변수명.remove(특정 값) | O(N) |
리스트에서 특정 값을 가지는 원소를 모두 제거하기
a = [1,2,3,4,5,5,5]
remove_set = {3,5}
result = [i for i in a if i not in remove_set]
튜플을 사용하면 좋은 경우
- 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
ㆍ최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용
- 데이터의 나열을 해싱(Hashing)의 키 값으로 사용해야 할 때
ㆍ튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다.
- 리스트보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
- 파이썬의 사전 자료형은 해시 테이블(Hash Table)를 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다
집합 자료형
- 특징 : 중복 허용 X, 순서가 없다.
- 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
빠르게 입력 받기
import sys
data = sys.stdin.readline().rstrip()
global 키워드
- global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 된다.
a = 0
def func():
global a
a += 1
for i in range(10):
func()
print(a) # 10
- 리스트의 경우 오류없이 수행 가능
array = [1,2,3,4,5]
def func():
array.append(6) # [1,2,3,4,5,6]
람다 표현식 예시
- 내장 함수에서 사용
sorted(array, key=lambda x: x[1])
- 여러 개의 리스트에 적용
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a,b: a+b, list1, list2)
print(list(result)) # [7,9,11,13,15]
실전에서 유용한 표준라이브러리
- 내장 함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공한다.
- itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들 제공
ㆍ특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용
- heapq : 힙(Heap) 자료구조를 제공한다.
ㆍ일반적으로 우선순위 큐 기능을 구현하기 위해 사용 - 다익스트라 최단 경로 문제
- bisect : 이진 탐색(Binary Search) 기능을 제공
- collections : 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함한다.
- math : 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함
순열과 조합
- 순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것 (순서고려)
ㆍnPr = n * (n - 1) * (n - 2) * ... * (n - r + 1)
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3)) # 모든 순열 구하기
- 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
ㆍnCr = ( n * (n - 1) * (n - 2) * ... * (n - r + 1) ) / r!
from itertools import combinations
data = ['A','B','C']
result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합
- 중복 순열
from itertools import product
data = ['A','B','C']
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복허용)
- 중복 조합
from itertools import combinations_with_replacement
data = ['A','B','C']
result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)
Counter
- 리스트와 같은 반복 가능한(iterable) 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는지를 알려준다.
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue'])
print(counter['green'])
print(dict(counter))
최대 공약수와 최소 공배수
import math
# 최소 공배수(LCM)를 구하는 함수
def lcm(a,b):
return a * b // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(21, 14)) # 최대공약수(GCD) 계산
print(lcm(21,14)) # 최소공배수(LCM) 계산