PHM 2023. 8. 24. 14:35

리스트 컴프리헨션

# 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) 계산