자주 사용하는 모듈
이번 시간에는 알고리즘에서 자주 쓰이는 파이썬 모듈에 대해 알아보겠습니다. 이 내용은 파이썬을 사용할 때 자주 사용하는 모듈들이라서 많은 내용을 관통하는 중요한 내용입니다.
입출력
딕셔너리
자료구조
순열과 조합
시뮬레이션
모듈
모듈은 클래스, 함수, 변수를 모아 놓은 파일입니다.
모듈은 파이썬을 설치하면 같이 설치되는 표준 라이브러리와 본인이 직접 알아서 설치해야 하는 외부 라이브러리로 나눌 수 있습니다.
표준 라이브러리는 우리가 초반에 배웠던 빠르게 입력 받을 때 사용하는 sys 모듈 등이 있으며, 외부 라이브러리는 주로 데이터 과학, 인공지능에서 사용하는 numpy, pandas 등이 있습니다.
참고로 백준 온라인 저지 사이트에서는 numpy, pandas 같은 외부 라이브러리를 지원해주지 않습니다.
모듈 불러오기
아래 코드와 같이 import를 이용하여 모듈을 불러올 수 있습니다.
이렇게 모듈만 불러오면 모듈이 가지고 있는 클래스나 함수, 변수를 사용해야 하는 경우 아래 사진처럼 모듈.클래스, 모듈.함수로, 모듈.변수로 입력해야 합니다.
클래스, 함수, 변수는 이제부터 한 번에 기능이라고 묶어서 언급하겠습니다.
모듈 내 기능만 불러오기
A모듈의 B기능만 가져오고 싶으면 from A import B를 사용하면 됩니다.
이렇게 모듈 내의 특정 기능만 불러온다면 모듈 이름을 입력하지 않고, 기능만 작성해서 사용할 수 있습니다.
모듈, 기능 이름 바꾸기
A 모듈을 C라고 사용하고 싶은 경우
A 모듈의 B 기능을 C라고 사용하고 싶은 경우
위와 같이 작성합니다.
import A as C는 주로 numpy, pandas, matplotlib 등과 같은 외부 라이브러리에서 자주 쓰입니다.
from A import B as C는 B의 이름이 길 경우에 사용합니다. itertools 모듈에서 순열과 조합인 permutations와 combinations을 각각 pm, cb로 줄여서 사용하는 편입니다.
저 같은 경우에는 밑에서 배우는 collections.defaultdict를 여러 개 사용해야 할 때 dd라고 설정해서 사용하고 있네요. 그냥 이름이 길다 싶으면 as를 사용해서 짧게 사용하시면 됩니다.
sys 모듈
sys.stdin.readline
이전에도 배운 내용입니다. 빠른 입출력 중에서 빠른 입력을 위해 사용됩니다.
파이썬은 100,000개 이상의 입력값이 들어올 때, 로직은 정상인데 시간 초과가 나온다면 빠른 입출력을 생각해볼 수 있습니다. 혹은 pypy3이 python3보다 더 빠르니 pypy3으로도 제출할 수 있습니다.
위 링크를 보시면 C++, JAVA, Python, Pypy 속도가 나와 있습니다.
여기에서 주의할 점은 문자열로 빠른 입력을 받을 시 줄 바꿈(\n)도 문자열로 입력 받기 때문에 공백이나 줄 바꿈을 없애주는 메소드인 strip()을 사용하여 없애주어야 합니다.
빠른 입력이 있으면 빠른 출력도 있습니다. sys.stdout.write()함수인데요. 아쉽게도 알고리즘 문제를 풀 때에는 잘 사용하지 않는 편입니다.
빠른 입력과 다르게 빠른 출력은 단순히 print보다 출력이 많이 차이 나지 않는다는 것을 알 수 있습니다.
sys.setrecursionlimit
이 내용은 함수와 관련 있기 때문에 함수를 모르는 분은 그냥 읽고 넘어가시면 됩니다.
setrecursionlimit를 3개 단어로 쪼개보면 set + recursion + limit로 나눌 수 있습니다. 즉, 재귀 최대 깊이를 설정한다는 명령어입니다.
파이썬에서는 재귀 깊이가 기본으로 1000이 설정되어 있기 때문에 재귀 함수를 1000번 이상 돌리면 RecursionError가 나오게 됩니다.
그래서 재귀 깊이를 x로 설정해야 한다면 sys.setrecursionlimit(x)를 입력해줘야 합니다. 재귀 깊이를 100,000으로 설정해야 한다면 sys.setrecursionlimit(100000)이 되겠네요.
재귀 함수는 알고리즘과 자료구조에서 빠질 수 없는 내용이기 때문에 파이썬을 이용하여 문제를 푸신다면 많이 사용하게 될 겁니다.
collections 모듈
collections.deque
덱 혹은 데크라고 부르는 deque입니다.
리스트의 상위 호환 자료구조로 리스트는 append(), pop()을 이용하여 맨 오른쪽에 요소를 추가하거나 요소를 뺄 수 있지만, 덱은 append()와 pop()뿐만 아니라 appendleft()와 popleft()로 맨 왼쪽에 요소를 추가하거나 뺄 수 있는 기능까지 지원합니다.
이 내용은 다음 주에 배울 내용인 큐와 덱 파트에서 배울 예정입니다.
collections.defaultdict
딕셔너리에서는 저장되지 않은 key값을 입력하여 코딩할 경우 KeyError가 나오게 됩니다.
하지만 defaultdict는 defaultdict에 저장되지 않은 key값을 입력할 경우 기본값으로 설정된 값이 나오게 됩니다. dict의 상위 호환 버전이죠
기본값을 설정하는 방법은 아래와 같습니다.
itertools 모듈
permutations과 combinations은 알고리즘 문제를 풀 때 쓰이는 곳은 별로 없지만, 삼성 A형, 삼성 역량테스트 문제에서 자주 쓰이기 때문에 넣어보았습니다.
itertools.permutations
우리가 고등학생 때 확률과 통계 시간에서 배웠던 그 순열을 보여주는 문제입니다.
[2, 3, 1]을 길이가 2인 순열로 나타낸다면 (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)로 총 6개를 저장하고 있을 것 입니다.
permutations에 필요한 인자는 (iterable = 순열을 뽑을 오브젝트, 순열의 길이)입니다..
itertools.combinations
마찬가지로 고등학생 때 배운 모든 조합을 출력해주는 함수입니다.
[2, 3, 1]을 길이가 2인 조합으로 나타내면 (1, 2), (1, 3), (2, 3)으로 총 3개를 저장하고 있을 것입니다.
역시 combinations에 필요한 인자는 (iterable = 조합을 뽑을 오브젝트, 조합의 길이)입니다.
permutations 와 combinations는 순열과 조합 파트에서 다시 다뤄볼 예정입니다.
Last updated