[코테] 코딩테스트 준비 (3)

julian·2025년 7월 28일

python

목록 보기
72/74

📌 공부할 때 참고한 영상은 나동빈님의 이코테 2021 강의 입니다.


이번에는 파이썬 문법들 중, 자주 사용되는 표준 라이브러리들에 대해 다뤄보자.

1. 내장 함수

내장 함수는 쭉 자주 다뤘기에 놓치면 안되는 부분들에 대해 조금 정리해보자.

1.1. eval()

eval()함수는 사람의 입장에서 수식으로 표현된 하나의 식이 있을 때, 계산한 결과를 실제 수 형태로 반환하는 함수다.
코드로 보면 이해가 잘 될 것이다.

1.2. sorted()

앞선 [코테] 코딩테스트 준비 (2) 글에서 다뤘던 내용이지만 중요하기에 다시 한번 정리해보자.

  • reverse=True
    이 기본적으로 오름차순의 정렬을 가지는 sorted를 내림차순으로 정렬하고자 한다면 reverse=True 속성을 달아주면 된다.
result=sorted([1,3,5,4,2])
r_result=sorted([1,3,5,4,2], reverse=True)
print(result)  # [1,2,3,4,5]
print(r_result)  # [5,4,3,2,1]
  • key
    key를 통해 정렬 기준을 명시해 줄 수 있는데, 정렬 기준은 일반적으로 lambda 함수 형태로 간단하게 넣어주는 경우가 많다.
arr=[("a",3), ("b",1), ("c",2)]
print(sorted(arr, key=lambda x: x[1], reverse=True))  # [("a",3), ("c",2), ("b",1)]

2. itertools

순열과 조합을 구하는 방법에 대해 알아보자.

  • 모든 가능한 경우의 수를 빠짐없이 조사하여 최적의 답을 찾는 완전탐색 알고리즘 문제를 풀 때 itertools 라이브러리를 이용하면 코드를 간결하게 만들 수 있도록 도와준다.
    이처럼 itertools는 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 기능들을 제공하는 라이브러리다.

  • 순열(Permutation)과 조합(Combination)의 차이는 순서에 있다.

    • 순열: 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열
      • {"A", "B', "C"}에서 세 개를 선택하여 나열: "ABC", "ACB", "BAC", "BCA", "CAB", "CBA"
      • 순열의 수: nPr=n(n1)(n2)...(nr+1)nPr=n*(n-1)*(n-2)*...*(n-r+1),
    • 조합: 서로 다른 n개에서 순서에 상관없이 서로 다른 r개를 선택
      • {"A", "B', "C"}에서 순서를 고려하지 않고 두 개를 뽑는 경우: "AB, "AC", "BC"
      • 조합의 수: nCr=n(n1)(n2)...(nr+1)r!nCr=\frac{n*(n-1)*(n-2)*...*(n-r+1)}{r!}

위와 같은 공식을 이용하여 모든 경우의 수가 얼마나 될지를 짐작해서 해당 문제를 풀기위해서 모든 조합을 고려하는 방법이 통할지 안통할지를 짐작하는 방식을 사용한다.
순열의 수를 구해봤을 때 값이 1천만 1억을 넘어가는 경우, 완전 탐색을 이용했을 때 시간초과 판정을 받을 확률이 높기 때문에, 실제로 전체 경우의 수를 고려할 때 이러한 순열의 수와 조합의 수를 많이 계산하게 된다.

  • 코드는 다음과 같이 사용한다.
from itertools import permutations, combinations

lst=["A","B","C"]
p_result=list(permutations(lst,3))
c_result=list(combinations(lst,2))
print(p_result)  # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
print(c_result)  # [('A', 'B'), ('A', 'C'), ('B', 'C')]
  • 중복 순열과 중복 조합
from itertools import product, combinations_with_replacement

lst=["A","B","C"]
p_result=list(product(lst,repeat=2))
c_result=list(combinations_with_replacement(lst,2))
print(p_result)  # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
print(c_result)  # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

3. heapq

힙(Heap) 자료구조를 제공하는 라이브러리다.
이는 다익스트라(Dijkstra)와 같은 최단경로 알고리즘과 같은, 우선순위 큐(Priority Queue) 기능을 구현하기 위해 사용된다.

4. bisect

이진 탐색(Binary Search) 기능을 제공하는 라이브러리다.

5. collections

덱(deque), 카운터(Counter)와 같은 유용한 자료구조를 포함하는 라이브러리다.

  • 카운터(Counter)
    리스트와 같은 반복 가능한(iterable) 객체가 주어졌을 때, 내부 원소의 등장 횟수를 세는 기능을 제공한다. WordCloud에서 사용했던 것을 떠올리면 된다.
from collections import Counter
counter = Counter(["red", "blue", "green", "red", "red", "RED"])
print(counter["red"])  # 3
print(dict(counter))  # {'red': 3, 'blue': 1, 'green': 1, 'RED': 1}

6. math

다양한 수학적 기능을 제공하는 라이브러리다.
다양한 함수들 중 최대 공약수(GCD(Greatest Common Divisor))와 이 최대 공약수를 이용해 최소 공배수(LCM(Least Common Multiple))를 구하는 방법을 보면 다음과 같다.

최대 공약수: 공통된 약수 중 가장 큰 값
최소 공배수: 공통된 배수 중 가장 작은 값

import math

# 최소 공배수(LCM) 구하는 공식
def lcm(a,b):
	return a*b //math.gcd(a,b)
a=21
b=14
print(math.gcd(21,14))  # 7
print(lcm(21,14))  # 42
profile
AI Model Developer

0개의 댓글