[Python] 코딩테스트를 위한 파이썬 문법(5) 주요 라이브러리 문법, 유의점

jinjoo-jung·2023년 7월 22일
0

CodingTest

목록 보기
4/9

표준 라이브러리

표준 라이브러리란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.

코딩 테스트를 준비하면서 반드시 알아야 하는 라이브러리는 6가지 정도이다.
이 6가지 라이브러리 또한 각각 많은 기능을 포함하고 있어서 , 가장 중요하고 알아두어야 할 핵심 내용 요약

  • 내장 함수: print(), input() 과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다. 파이썬 프로그램을 작성할 때 없어서는 안 되는 필수적인 기능을 포함하고 있다.
  • itertools: 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.
  • heapq: 힙(Heap) 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용한다.
  • bisect: 이진 탐색(Binary Search) 기능을 제공하는 라이브러리이다.
  • collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.
  • math : 필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함하고 있다.

- 내장함수

  • 파이썬에는 별도의 import 명령어 없이 바로 사용할 수 있는 내장 함수가 존재한다. 내장 함수는 프로그램 작성에 있어 가장 기본적이며 필수적인 기능을 포함하고 있다. 대표적인 내장 함수는 input(), print() 인데, 이 2가지 입출력함수는 이미 앞서 언급했기 때문에 이를 제외한 함수를 다룬다.

1. sum() 함수

리스트와 같은 iterable 객체(파이썬에서 iterable 객체는, 반복 가능한 객체를 말한다. 리스트, 사전 자료형, 튜플 자료형 등이 이에 해당한다.)가 입력으로 주어졌을 때, 모든 원소의 합을 반환한다.

result = sum([1,2,3,4,5])
print(result)      //15

2. min() 함수

파라미터가 2개 이상 들어왔을 때 가장 작은 값을 반환

result = min([7,3,5,2])
print(result) //2

3. max() 함수

파라미터가 2개 이상 들어왔을 때 가장 큰 값을 반환

result = max([7,3,5,2])
print(result).   // 7

4. eval() 함수

수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환
ex) 문자열 형태로 주어진 수식 (3 + 5) *7 을 계산하는 소스코드는 다음과 같다

result = eval("(3 + 5) * 7")
print(result)     // 56

4. sorted() 함수

iterable 객체가 들어왔을 때, 정렬된 결과를 반환한다. key 속성으로 정렬 기준을 명시할 수 있으며, reverse 속성으로 정렬된 결과 리스트를 뒤집을지의 여부를 설정할 수 있다.

# 오름차순으로 정렬
result = sorted([9,1,8,5,4[)
print(result)   // [1,4,5,8,9]

# 내림차순으로 정렬
result = sorted([9,1,8,5,4], reverse = True)
print(result)     // [9,8,5,4,1]
  • 리스트와 같은 iterable 객체는 기본으로 sort()함수를 내장하고 있어서 굳이 sorted() 함수를 사용하지 않고도 sort()함수를 사용해서 정렬할 수 있다. 이 경우 리스트 객체의 내부 값이 정렬된 값으로 바로 변경된다.
data = [9,1,8,5,4]
data.sort()
print(data) // [1,4,5,8,9]

- itertools

  • 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리
  • 제공하는 클래스는 매우 다양하지만, 코테에서 가장 유용하게 사용할 수 있는 클래스는

1. permutations

  1. permutations : 리스트와 같은 iterable 객체에서 r 개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해준다.
  • 클래스이기 때문에 객체 초기화 이우헤는 리스트 자료형으로 변환하여 사용
from itertools import permutations
data = ['A' , 'B', 'C'] #데이터 준비
result = list[permutations(data, 3)).  # 모든 순열 구하기
print(result)

2. combinations

  1. combinations : 리스트와 같은 iterable 객체에서 r 개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)를 계산한다.
  • 클래스 이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.
from itertools import combinations
data = ['A' , 'B', 'C'] #데이터 준비
result = list[combinations(data, 2)).  # 2개를 뽑는 모든 조합 구하기
print(result)

3. product()

  • permutations와 같이 리스트와 같은 iterable 객체에서 r 개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산한다. 다만 원소를 중복하여 뽑는다.
  • product 객체를 초기화 할 때는 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어준다.
  • product는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용
from itertools import product

data = ['A', 'B', 'C']
result = list(product(data , repeat = 2)) #2개를 뽑는 모든 순열 구하기(중복 허용)

print(result)

4. combinations_with_replacement

  • combinations와 같이 리스트와 같은 iterable 객체에서 r 개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)를 계산
  • 다만 원소를 중복해서 뽑는다
  • combinations_with_replacement는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용해야 한다.
from itertools import combinations_with_replacement
data =['A' , 'B' , 'C']
result = list(combinations_with_replacement(data, 2)) #2개를 뽑는 모든 조합(중복 허용) 
print(result)

- heapq

파이썬에서는 힙 기능을 위해 heapq 라이브러리를 제공한다. heapq는 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용

  • heapq 외에도 PriorityQueue 라이브러리를 사용할 수 있지만, 코딩 테스트 환경에서는 보통 heapq가 더 빠르게 동작하므로 heapq을 이용하도록 하자

  • 파이썬의 힙은 최소 힙으로 구성되어 있으므로 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 시간 복잡도 O(NlogN)에 오름차순 정렬이 완료된다. 보통 최소 힙 자료구조의 최상단 원소는 항상 '가장 작은'원소이기 때문

  • 힙에 원소를 삽입할 때는 heapq.heappush() 메서드를 이용하고, 힙에서 원소를 꺼내고자 할 때는 heapq.heappop() 메서드를 이용한다.

    <힙정렬을 heapq로 구현하는 예제>

    import heapq
    
    def heapsort(iterable):
       h =[]
       result =[]
       # 모든 원소를 차례대로 힙에 삽입
       for value in iterable:
           heapq.heappush(h,vlaue)
       # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
       for _ in range(len(h)):
           result.append(heapq.heappop(h))
       return result
       
       result = heapsort([1,3,5,7,9,2,4,6,8,0])
       print(result)
       
       // 출력 : [0,1,2,3,4,5,6,7,8,9] 
  • 파이썬에선 최대 힙을 제공하지 않는다. 따라서 heapq 라이브러리를 이용하여 최대 힙을 구현해야 할 때는 원소의 부호를 입시로 변경하는 방식을 사용한다. 힙에 원소를 삽입하기 전에 잠시 부호를 반대로 바꾸었다가, 힙에서 원소를 꺼낸 뒤에 다시 원소의 부호를 바꾸면 된다. 이러한 방식으로 최대 힙을 구현하여 내림차순 힙 정렬을 구현하는 예시

import heapq

def heapsort(iterable):
    h =[]
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, -value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for _ in range(len(h))
        result.append(-heapq.heappop(h))
    return result
    result = heapsort([1,3,5,7,9,2,4,6,8,0])
    print(result)
    

- bisect

  • 파이썬에서는 이진 탐색을 쉽게 구현할 수 있도록 bisect 라이브러리를 제공한다. bisect 라이브러리는 '정렬된 배열'에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용한다. bisect 라이브러리에서는 bisect_left() 함수와 bisect_right() 함수가 가장 중요하게 사용되며, 이 두 함수는 시간 복잡도O(logN)에 동작한다.

bisect_left(a,x)

  • 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드

bisect_right(a,x)

  • 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드

ex) 정렬된 리스트 [1,2,4,4,8]이 있을 때 새롭게 데이터 4를 삽입하려 한다고 가정하자. 이때 bisect_left(a,4)와 bisect_right(a,4)는 각각 인덱스 값으로 2와 3를 반환한다.

  • 위 두 함수는 '정렬된 리스트'에서 '값이 특정한 범위에 속하는 원소의 개수'를 구하고자 할 때, 효과적으로 사용될 수 있다.

- collections

1. deque

  • 파이썬의 colle3ctions 라이브러리는 유용한 자료구조를 제공하는 표준 라이브러리
  • collections 라이브러리의 기능 중에서 코딩 테스트에서 유용하게 사용되는 클래스는 deque와 counter이다.
  • 보통 파이썬에서는 deque를 사용해 큐를 구현. 별도로 제공되는 Queue 라이브러리가 있는데 일반적인 큐 자료구조를 구현하는 라이브러리는 아니다. 따라서 deque를 이용해 큐를 구현해야 한다.
  • 기본 리스트 자료형은 데이터 삽입, 삭제 등의 다양한 기능을 제공
  • 리스트가 있을 때 중간에 특정한 원소를 삽입하는 것도 가능
  • 하지만 리스트 자료형은 append() 메서드로 데이터를 추가하거나, pop() 메서드로 데이터를 삭제할 때 '가장 뒤쪽 원소'를 기준으로 수행된다. 따라서 앞쪽에 있는 원소를 삭제하거나 앞쪽에 새 원소를 삽입할 때에는 리스트에 포함된 데이터의 개수에 따라서 많은 시간이 소요될 수 있다. 리스트에서 앞쪽에 있는 원소를 삭제하거나 앞쪽에 새 원소를 삽입할 대의 시간 복잡도는 O(N)이다.
  • deque에서는 리스트 자료형과 다르게 인덱싱, 슬라이싱 등의 기능은 사용할 수 없다. 다만 연속적으로 나열된 데이터의 시작 부분이나 끝 부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용될 수 있다. deque는 스택이나 큐의 기능을 모두 포함한다고도 볼 수 있기 때문에 스택 혹은 큐 자료구의 대용으로 사용될 수 있다.

deque는 첫 번째 원소를 제거할 때 popleft()를 사용하며, 마지막 원소를 제거할 때 pop()을 사용한다.
또한 첫 번째 인덱스에 원소 x를 삽입할 때 appendleft(x)를 사용하며, 마지막 인덱스에 원소를 삽입할 때 append(x)를 사용한다.
따라서 deque를 큐 자료구조로 이용할 때, 원소를 삽입할 때에는 append()를 사용하고 원소를 삭제할 때에는 popleft()를 사용하면된다. 그러면 먼저 들어온 원소가 항상 먼저 나가게 된다.

2. Counter

  • 등장 횟수를 세는 기능을 제공
  • 구체적으로 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.

- math

  • 수학적인 기능을 포함하고 있는 라이브러리
  • 팩토리얼, 제곱근, 최대 공약수(GCD) 등을 계산해주는 기능을 포함

1. factorial(x)

  • x! 값을 반환한다
import math
   
print(math.factorial(5))    # 5 팩토리얼을 출력

2. sqrt(x)

  • x의 제곱근을 반환
import math

print(math.sqrt(7)) // 7의 제곱근을 출력

3. gcd(a,b)

  • 최대 공약수
import math

print(math.gcd(21,14))     //7

4. 파이(pi)나 자연상수 e

import math

print(math.pi)   # 파이(pi) 출력
print(math.e).   # 자연상수 e 출력
profile
개인 개발 공부, 정리용 🔗

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

많은 도움이 되었습니다, 감사합니다.

답글 달기

관련 채용 정보