[ 이것이 코딩테스트다 ] 4일차

안영우·2020년 12월 28일
1
post-thumbnail
post-custom-banner

[ 이 시리즈에서 작성하는 내용은 이것이 코딩 테스트다 - 나동빈 에서 발췌한 내용을 인용했습니다. ]


✏️ 서론

조건문, 반복문, 함수, 입출력에 대해 배워봤다.
이번시간에는 코딩테스트에서 주로 사용하는 라이브러리가 무엇인지 알아보자.


✏️ 본론

파이썬의 일부 라이브러리는 잘못 사용하면 수행 시간이 비효율적으로 증가하므로 여기서 작성하는 내용을 잘 기억하자.

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

파이썬 표준 라이브러리는 공식문서에서도 자세히 확인할 수 있다. 추가로 필요한 기능이 있다면 공식문서를 활용하자.

코딩 테스트를 준비하며 반드시 알아야 하는 라이브러리는 6가지 정도이다. 각 라이브러리의 가장 중요하고 알아두어야 할 핵심만 먼저 살펴보자.

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

📍 내장함수

내장 함수는import 명령어 없이 바로 사용할 수 있다.

⚡️ eval()

eval(): 해당 수식을 계산한 결과를 반환

result = eval('(3+5) * 7')
👉🏽 56

⚡️ sorted()

sorted(): iterable 객체가 들어왔을 때, 정렬된 결과를 반환

  • iterable: [ List ], ( Tuple ), [ Dictionary ]
  • key = lambda a: a[x], 원소기준으로 오름 / 내림 차순 정렬가능

sort(): list iterable 객체는 기본으로 sort() 함수 사용 가능

  • iterable: [ List ], ( Tuple ), [ Dictionary ]
# sorted ()
data_list = [3, 1, 2, 5]
data_tuple = (3, 1, 2, 5)
data_dict = [('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)]
data_dict_key = sorted([('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)], key = lambda x: x[1], reverse=True)

print(sorted(data_list))
👉🏽 [1, 2, 3, 5]
print(sorted(data_list, reverse=True))
👉🏽 [5, 3, 2, 1]

print(sorted(data_tuple))
👉🏽 [1, 2, 3, 5]
print(sorted(data_tuple, reverse=True))
👉🏽 [5, 3, 2, 1]

print(sorted(data_tuple))
👉🏽 [('동생1', 23), ('동생2', 13), ('동생3', 11), ('안영우', 26)]
print(sorted(data_tuple), lambda a: a[1])
👉🏽 [('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)]

# sort(only list)
data_list = [3, 1, 2, 5]
data_list.sort()

print(data_list)
👉🏽 [1, 2, 3, 5]

📍 itertools

⚡️ permutation(), combination()

permutation(): list iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)

combination(): list iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)

from itertools from permutations
from itertools from product
from itertools from combinations_with_replacement


data = ['A', 'B', 'C']

## 순열
data_permutation = list(permutations(data, 2))
👉🏽 [('A', 'B'), ('B', 'A')]

# 순열(중복허용)
data_product = list(product(data, repeat = 2))
👉🏽 [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]

# 조합(중복허용)
data_combination = list(combinations_with_replacement(data, 2))
👉🏽 [('A', 'A'), ('A', 'B'), ('B', 'B')]

📍 heapq

heapq(): 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하는 함수

import heapq

def heapsort(iterable):
    h = []
    result = []

    for value in iterable:
        heapq.heappush(h, value)
    for i in range(leng(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]

# max_heapq
def max_heapq(iterable):
    h = []
    result = []

    for value in iterable:
        heapq.heappush(h, -value)
    for i in range(leng(h))
        result.append(-heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
👉🏽 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

📍 bisect

bisect(): 정렬된 배열에서 특정한 원소를 찾을 때 주로 사용하고 배열 위치를 반환한다.

  • bisect_left: 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 method
  • bisect_right: 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 method

예를 들어, 정렬된 리스트 [1, 2, 4, 4, 8]이 있을 때, 새롭게 데이터 4를 대입한다고 가정하면

bisect_left(a, 4)는 2가 될 것이고, bisect_right(a, 4)는 4가 될 것이다.

from bisect import bisect_left, bisect_right

# 특정한 원소의 배열 위치 
a = [1, 2, 4, 4, 8]
print(bisect_left(a, 2))
👉🏽 2
print(bisect_right(a, 4))
👉🏽 4

# 값이 특정 범위에 속하는 원소의 개수
def count_by_range[a, left_value, right_value]:
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)
    return right_index - left_index

a = [ 1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
print(count_by_range(a, 4, 4))
👉🏽 2

print(count_by_range(a, 3, 3))
👉🏽 4

# 0 ~ 9 범위의 데이터 개수
print(count_by_range(a, 1, 9))
👉🏽 10

📍 collections

⚡️ deque()

deque(): Queue라이브러리는 일반적인 큐 자료구조를 구현하는 라이브러리는 아니다. 따라서, deque()를 이용해 큐를 구현해야 한다.

from collection import deque

data = deque([2, 3, 4])

data.appendleft(1)
data.append(5)

print(data)
👉🏽 deque([1, 2, 3, 4, 5])

print(list(data))
👉🏽 [1, 2, 3, 4, 5]

⚡️ Counter()

counter(): 등장 횟수를 세는 기능

  • list iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지 알려준다
from collections import Counter
data_counter = ['red', 'blue', 'blue', 'orange', 'green', 'blue', 'green']

print(Counter(data_counter))
👉🏽 Counter({'blue': 3, 'green': 2, 'red': 1, 'orange': 1})

print(dict(data_counter))
👉🏽 {'red': 1, 'blue': 3, 'orange': 1, 'green': 2}

print(counter['blue'])
👉🏽 3

📍 math

math(): 수학계산을 요구하는 기능
factorial, sqrt, gcd, pi, e등을 계산 할 수 있다.

import math

# factorial(x)
print(math.factorial(5))
👉🏽 120
# sqrt(x): x의 제곱근
print(int(math.sqrt(49)))
👉🏽 7

# gcd(x): 최대 공약수
print(math.gcd(21, 14))
👉🏽 7

# 파이(pi) 출력
print(math.pi)
👉🏽 3.141592653589793

# 자연상수(e) 출력
print(math.e)
👉🏽 2.718281828459045

✏️ 결론

매일 해뜨기 전 06시 30분에 기상해서 7시부터 약 3시간동안 알고리즘 공부를 했는데 처음에는 정신이 몽롱해지다가 어느샌가 머릿속에 ⚡️ 번개 ⚡️가 치면서 들어올때가 있다.

그럴 때 기분이 좋다.

아직 책의 1/3도 읽지 못했지만 하루하루 꾸준하게 공부하다보면
알고리즘의 개념에 대해 알 수 있지 않을까..?

profile
YW_Tech
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 8월 28일

안녕하세요. 비록 4년이 지난 게시글이긴 하지만,,
max_heapq 예시 코드에서 result부분에 heapsort가 아니라 max_heapq가 되어야할 것 같아서 말씀드립니다!!
게시글 잘 보고 갑니다. 감사합니다~!

답글 달기