본문 바로가기
코딩 테스트/코딩테스트 - 학습

코딩 테스트 파이썬 문법 (중간편)

by 안스 인민군 2023. 1. 12.

코딩테스트를 준비하며 반드시 알아야 하는 라이브러리 6가지

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

내장 함수

문자열에서 리스트로 바꿀 때 arr = str1.split('')로 착각하는데 arr = list(str1)이다.

result = [1,2,3,4,5]

sum(result) #iterable 객체가 들어왔을 때 (반복 가능한 객체) 리스트, 사전자료형, 튜플자료형 등

min(7,3,5,2) # 제일 작은거 반환

max(7,3,5,2) # 제일 큰 거 반환

result = eval("(3+5) * 7")

# 문자열 -> 리스트
str = "python"
my_list = list(str) # ['p','y','t','h','o','n']

# 리스트 -> 문자열 변환
str_list = ['There', 'is', "items"]
result = ' '.join(map(str, str_list)) # There is 4 items

itertools

  • 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리
  • permutations (순열)
  • combinations (조합)
  • product (중복을 허용하는 순열)
  • combinations_with_replacement (중복을 허용하는 모든 조합)
  • 결과값이 튜플(tuple)로 나온다.
  • 순열 조합 모두 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations, combinations, product, combinations_with_replacement

data = ['a', 'b', 'c']

# (순열) 2개를 뽑아 나열하는 모든 순열을 출력
result = list(permutations(data,2)) # [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

# (조합) 2개를 뽑는 모든 조합 구하기
result = list(combinations(data,2)) # [('a', 'b'), ('a', 'c'), ('b', 'c')]

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

# (중복 허용 조합)2개를 뽑는 모든 조합 구하기
result = list(combinations_with_replacement(data,2)) # [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]

heapq (Min heap)

  • 힙기능을 위해 heapq 라이브러리를 제공
import heapq
  • 다익스트라 최단 경로 알고리즘등에서 우선운위 큐 기능을 구현하고자 할 때 사용
    • PriorityQueue 라이브러리를 사용할 수 있지만 코딩테스트 환경에서는 heapq가 더빠르게 동작함으로 heapq를 사용하자
  • 최소 힙(min heap)으로 구성되어 있으므로 넣었다 빼는 것만으로 O(NlogN)에 오름차순 정렬이 완료된다.
    • 보통 최소 힙 자료구조의 최상단 원소는 항상 '가장 작은'원소이기 때문이다

heapq 생성 : heapq는 생성해서 사용하는 것이 아니라 일반 리스트를 그대로 이용

hq = []
print(hq)  # print결과 : []

heapq.heappush( (리스트), (값) ) : 리스트에 Min Heap 기준으로 값 추가

heapq.heappush(hq, 3)
heapq.heappush(hq, 2)
heapq.heappush(hq, 1)
print(hq)  # print결과 : deque([1, 3, 2])

heapq.heappop( (리스트) ) : 리스트에서 Min Heap 기준으로 값 삭제 후 반환

print(heapq.heappop(hq))  # print결과 : 1

heapq.heapify( (리스트) ) : 기존 리스트를 Min Heap으로 변환

hq = [3, 5, 4, 1, 2]
heapq.heapify(hq) #[1, 2, 3, 4, 5]

heap으로 max-heap 구현

1. 튜플방식

heapq.heappush(hq, -1)
heapq.heappush(hq, -2)
heapq.heappush(hq, -3)
 
print(-heapq.heappop(hq))  # print결과 : 3
print(-heapq.heappop(hq))  # print결과 : 2
print(-heapq.heappop(hq))  # print결과 : 1

2. - 추가 방식

heapq.heappush(hq, (-1, 1))
heapq.heappush(hq, (-2, 2))
heapq.heappush(hq, (-3, 3))
 
print(heapq.heappop(hq)[1])  # print결과 : 3
print(heapq.heappop(hq)[1])  # print결과 : 2
print(heapq.heappop(hq)[1])  # print결과 : 1

힙으로 이중리스트를 정렬은 앞에를 우선 정렬 후 뒤를 정렬한다.

e = [[2, 4],[1, 5], [0, 3], [0, 1]]
heapq.heapify(e) # [[0, 1], [1, 5], [0, 3], [2, 4]]

 

bisect

  • 이진탐색을 쉽게 구현할 수 있도록 하는 라이브러리
  • '정렬된 배열'에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용 <- 꼭 정렬을 해줘야 함
  • bisect_left(a,x)
    • 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_right(a,x)
    • 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
  • '정렬된 리스트'에서 '값이 특정 범위에 속하는 원소의 개수'를 구하고자 할 때 사용
from bisect import bisect_left, bisect_right

a = [1, 2, 4, 4, 8]

print(bisect_left(a, 3))  # 2
print(bisect_right(a, 5)) # 4

collections

1. deque

  • double ended queue의 약자로, 양방향 연결리스트(Doubly Linked List)로 구성되어 있다.
  • 스택, 큐를 구현할 때 사용하는 라이브러리
  • 가장 앞 원소추가, 가장 앞 원소제거에서 O(1)의 시간복잡도를 가진다
  • 인덱싱, 슬라이싱 등은 사용할 수 없다.
from collections import deque
data = deque([2,3,4])
data.appendleft(1)
data.append(5)
data.pop()
data.popleft()
print(data)
# deque([2, 3, 4])
print(list(data))
# [2, 3, 4]

2. Counter

  • 등장 횟수를 세는 기능을 제공
  • 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
  • 원소별 등장 횟수를 세는 기능이 필요할 때 짧은 코드로 이를 구현할 수 있다.
  • 리스트의 원소와 원소별 빈도수를 키-값으로 갖는 딕셔너리 반환
  • 원소 추가, 삭제, 여러 원소 한번에 추가 모두 가능하다.
from collections import Counter

list = ['Hello', 'HI', 'How', 'When', 'Where', 'Hello']
dic = Counter(list) 		# Counter({'Hello': 2, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1})

# 한개 삭제
dic['Hello'] -= 1			# Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1})

# 한개 추가
dic['asd']+=1				# Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1, 'asd': 1})

# 여러개 추가
dic.update(['1','2','3'])	# Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1, 'asd': 1, '1': 1, '2': 1, '3': 1})


# most_common() : Counter()에서 가장 빈도수가 높은 순으로 표시해 주는 하수 입니다. 단, 인자값으로 숫자를 입력하시면 그 숫자번째까지의 빈도수를 표시해줍니다.
value = "Hello Appia"
countValue = Counter(value)
print(countValue.most_common()) # [('l', 2), ('p', 2), ('H', 1), ('e', 1), ('o', 1), (' ', 1), ('A', 1), ('i', 1), ('a', 1)]
print(countValue.most_common(2) # [('l', 2), ('p', 2)]

3. 사전 자료형의 value를 리스트로 만들고 추가하는 방법

from collections import defaultdict
data = defaultdict(list)
tickets = [[0,0],[1,1],[2,2]]
for ticket in tickets:
    data[ticket[0]].append(ticket[1])

math

  • 수학적인 기능을 포함하고 있는 라이브러리
  • 팩토리얼, 제곱근, 최대공약수(GCD) , Pi
  • 반올림은 math 함수에 포함되지 않는다!!
import math

print(math.factorial(5)) # 5 팩토리얼 출력

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

print(math.gcd(21,14)) # 21과 14의 최대 공약수 , 7

print(math.pi) # 파이 출력

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

math.ceil(5.123) # 소수점 올림

math.floor(5.123) # 소수점 내림

round(5.123) # 소수점 반올림

추가로 최소공배수 만드는법

import math

def lcm(a, b):
    return a * b // math.gcd(a, b) #실수로 나오니까 정수로 나오겠끔 //로 나누자

'코딩 테스트 > 코딩테스트 - 학습' 카테고리의 다른 글

정렬  (0) 2023.01.20
완전 탐색  (0) 2023.01.18
dfs bfs  (0) 2023.01.14
코딩테스트 파이썬 문법 (기초편)  (0) 2023.01.12
코딩테스트 준비 (By Python...)  (2) 2023.01.10