Python으로 백준 풀기 - 자주 사용하는 라이브러리와 구문
처음 알고리즘 문제풀이를 접한다면 solved.ac에서 제공하는 연습문제를 풀어보는 것을 추천한다.
'새싹' 이라는 키워드로 기본적으로 알아야 할 것들을 정리해 두었다.
여기까지는 '문제는 푼다'기 보다는 '프로그래밍 문제풀이를 어떻게 시작해야 하는가'에 대한 내용이다.
자주 사용하는 라이브러리
import sys
import math
import heapq
from itertools import combinations, permutations
from collections import deque
input = sys.stdin.readline
INF = int(1e9)
필자는 자주 사용하는 라이브러리를 지우지 않고 그대로 둔다.
새로운 문제를 풀 때마다 입력하는 것보다 해당 코드 아래에 문제 풀이를 하고 풀이만 지웠다 썼다 하는 것이 편하다.
몇 가지 설명해 보겠다.
import sys
input = sys.stdin.readline
거의 모든 풀이에 포함하는 구문이다.
빠른 입출력을 위해 사용하는 라이브러리이다.
다만 문제 풀이를 하다 보면 입력을 받을 때마다 sys.stdin.readline() 처럼 입력받는 것이 번거롭게 느껴진다.
때문에 input = sys.stdin.readline 한 줄을 추가하여 input() 함수를 호출하면 바로 sys 입력으로 변환되도록 한다.
from collections import deque
문제 풀이 시 상당히 많이 사용하는 자료구조 deque이다.
양방향으로 데이터에 접근할 수 있는 것이 장점이다.
보통 popleft() 함수를 쓰기 위해 사용하는 것 같다.
(맨 앞의 인덱스에 접근하기 위해서)
from itertools import combinations, permutations
순열 조합 관련 문제가 나오면 자주 사용하는 라이브러리 itertools이다.
문제를 풀다 보면 '~의 조건을 만족하는 수열을 구하시오.' 와 같은 구문이 나오는 경우가 있다.
이때 해당 라이브러리를 활용하면 코드를 조금 더 간결하고 직관적으로 풀 수 있다.
import math
sqrt() 함수 활용 때문에 자주 사용한다.
소수판정 문제 등에서 에라토스테네스의 체 같은 알고리즘을 사용하면 루트(root)와 같은 수학 기호가 필요할 때가 있다.
import heapq
난이도가 올라가면 사용할 일이 많아지는 라이브러리이다.
힙은 최댓값과 최솟값을 빠르게 찾기 위해 특정한 규칙을 사용하는 자료구조이다.
난이도가 올라갈수록 시간제한이 타이트하게 설정되어 있는 경우가 많은데, 동작속도가 느린 python으로 이런 문제들을 해결하기 위해서는 필히 사용해야 하는 경우가 있다.
INF = int(1e9)
int 범위 내에서 무한대 값을 나타내기 위해 사용한다.
(1e9는 10의 9 제곱이라는 의미)
관례적인 값이다.
자주 사용하는 구문
변수1, 변수2 = map(자료형, input().rstrip().split())
여러 입력값을 한 번에 받을 때 자주 사용한다.
하나하나 의미를 뜯어보자.
map은 여러 개의 데이터를 입력받아 각각의 변수에 함수를 적용한 결과를 반환하는 내장함수이다.
rstrip()는 입력데이터의 오른쪽에 공백을 제거해 주기 위해 사용했다.
split() 말 그대로 입력 데이터를 나눠주는 함수이다.
array = list(map(int, input().rstrip().split()))
2DArray = [list(map(int, input().rstrip().split())) for _ in range(반복횟수)]
다음과 같이 데이터를 입력받는 경우도 많다.
for _ in range(반복횟수):
보편적으로 for i in range(n): 처럼 많이 사용한다.
하지만 i 값을 굳이 사용하지 않는다면 언더바를 사용해도 좋다.
print(*arr)
unpacking을 쉽게 하는 방법이다.
배열을 출력하고 싶은데 매번
for i in range(len(arr)):
print(arr[i], end = " ")
이렇게 쓰는 게 귀찮다면 위에서 사용한 방법대로 사용하는 것도 좋다.
번외
풀이 제출시에 python3에서 통과되지 않는 문제가 pypy3로 제출하면 통과되는 경우도 있습니다. 꿀팁(?)
다만, 출력은 맞아야함. (경험상 재귀를 사용했을 때는 더 느린경우도 많았다.)
정리
개인적으로 자주 사용한 라이브러리와 구문들을 공유해 보았습니다.
본 글에서 공유한 정보들이 알고리즘 풀이 실력을 늘려주지는 않겠지만, 문제 푸는 속도나 편의성 측면에서 도움이 될 것 같아 작성했습니다.
이후 추가적으로 공유하고 싶은 내용이 있다면 계속해서 업데이트하겠습니다!
'Algorithm > Etc' 카테고리의 다른 글
[Algorithm] Python - dictionary 활용과 시간 복잡도 (Big-O) (0) | 2025.01.18 |
---|