일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- docker
- 그리디
- 전산기초
- cs
- 1단계
- SWEA
- 이것이 코딩테스트다 with 파이썬
- 백준
- test-helper
- Object detection
- 실전알고리즘
- 코드수행
- ssd
- Python
- 딥러닝
- pytorch
- 모두를 위한 딥러닝 강좌 시즌1
- ubuntu
- 3단계
- 파이썬
- 머신러닝
- 2단계
- 자료구조 및 실습
- MySQL
- STL
- C++
- 구현
- CS231n
- AWS
- 프로그래머스
- Today
- Total
곰퓨타의 SW 이야기
[python] 입출력 및 주요라이브러리 문법 본문
python에서 알고리즘 문제를 풀 때 입력받는 방법이 여러가지 존재하고 각 입력 방법을 사용하는 법이 다르기 때문에 이에 대해 정리하고, 파이썬에 있는 주요 라이브러리 문법들을 살펴보고자 한다.
이는 '이것이 코딩테스트다 with 파이썬 편_나동빈_한빛미디어' 의 appendix A를 참고하였다.
www.hanbit.co.kr/store/books/look.php?p_code=B8945183661
이것이 취업을 위한 코딩 테스트다 with 파이썬
IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년부터 2020년까지의 코딩 테스트와 알고리즘 대회의 기출문제를 엄선하여 수록하였다.
www.hanbit.co.kr
1. 입출력
1. 한 줄의 문자열을 입력 받는 경우 (데이터가 줄바꿈으로 구분되는 경우) : input()
2. 여러 개의 데이터를 입력 받을 때(데이터가 공백으로 구분되는 경우) : list(map(int,input().split()))
# 데이터의 개수 입력
n = int(input())
# 각 데이터를 공백으로 구분하여 입력
data = list(map(int, input().split()))
data.sort(reverse=True)
print(data)
# n, m, k를 공백으로 구분하여 입력
n, m, k = map(int, input().split())
print(n,m,k)
input() 함수는 동작 속도가 느려서 시간 초과로 오답 판정을 받을 수 있기 때문에 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용하기도 한다. rstrip()은 readline()으로 입력을 받으면 입력 후 enter가 줄 바꿈 기호로 입력 되기 때문에 이 공백 문자를 제거하기 위해 사용된다. sys.stdin.readline().rstrip()
import sys
# 문자열 입력 받기
data = sys.stdin.readline().rstrip()
print(data)
여러가지 출력방법 예시
answer = 7
print("정답은" + str(answer) + "입니다.")
print("정답은" , str(answer), "입니다.")
print(f"정답은 {answer}입니다.")
2. 주요 라이브러리 문법
일부 라이브러리는 잘못 사용하면 수행 시간이 비효율적으로 증가하므로 주의해야 한다.
표준 라이브러리란, 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.
표준 라이브러리는 다양하지만 코딩테스트에서 알아야하는 핵심 라이브러리는 6가지라고 한다.
1. 내장함수 : print(), input()과 같은 기본 입출력 기능부터 sorted() 와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다. 파이썬 프로그램을 작성할 때 없어서는 안 되는 필수적인 기능을 포함한다.
2, itertools : 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.
3, heapq : 힙 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용한다.
4. bisect ; 이진탐색(Binary Search) 기능을 제공하는 라이브러리이다.
5. collections : deque, counter 등 유용한 자료구조를 포함하는 라이브러리이다.
6. math : 필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수 (GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함한다.
1. 내장함수
이는 이전에 정리한 것이 있어서 이를 참고하고자 한다.
kom-story.tistory.com/5?category=912027
2. itertools
이는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리로, permutations, combinations 인 순열과 조합이 있다.
kom-story.tistory.com/19?category=912027
이것도 과거에 정리한 적이 있지만, 책을 기반으로 한 번 다시 정리해보고자 한다.
permutations는 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우 (순열)을 계산해준다.
from itertools import permutations
data = ['A','B','C']
result = list(permutations(data,3))
print(result)
# [('A','B','C'), ('A','C','B'), ('B','A','C'), ('B','C','A'), ('C','A','B'), ('C','B','A')]
combinations는 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산해준다.
from itertools import combinations
data = ['A','B','C']
result = list(combinations(data,2))
print(result)
# [('A','B'), ('A','C'), ('B','C')]
product는 permutations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우 (순열)을 계산한다. 다만 이는 원소를 중복해서 뽑는다. product를 초기화할 때는 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어준다.
from itertools import product
data = ['A','B','C']
result = list(product(data,repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result)
#[('A','A'),('A','B'), ('A','C'), ('B','A'), ('B','B'), ('B','C'), ('C','A'), ('C','B'),('C','C')]
combinations_with_replacement는 combinations과 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다. (중복 허용)
from itertools import combinations_with_replacement
data = ['A','B','C']
result = list(combinations_with_replacement(data,2)) # 2개를 뽑는 모든 조합 구하기( 중복 허용)
print(result)
#[('A','A'),('A','B'), ('A','C'), ('B','B'), ('B','C'),('C','C')]
3. heapq
파이썬에서는 힙(heap) 기능을 위해 heapq 라이브러리를 제공한다. heapq는 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용된다. heapq 외에도 PriorityQueue 라이브러리도 사용할 수 있지만 ,heapq가 더 빠르다.
파이썬의 힙은 min heap으로 구성되어 있다. 힙에 원소를 삽입할 때는 heapq.heappush()를 활용하고, 힙에서 원소를 꺼내고자 할 때는 heapq.heappop()를 사용한다.
(최소 힙정렬)
import heapq
def heapsort(iterable) :
h = []
result = []
# 모든 원소를 차례대로 힙에 삽입
for value in iterable :
heapq.heappush(h, value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i 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]
(최대 힙정렬)
import heapq
def heapsort(iterable) :
h = []
result = []
for value inn iterable :
heapq.heappush(h,-value)
for i 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)
4. bisect
이진 검색을 쉽게 구현할 수 있도록 하는 bisect 라이브러리이다. bisect 라이브러리는 정렬된 배열에서 특정 원소를 찾아야 할 때 효과적이다. 아래 두 함수는 시간 복잡도 O(logN)으로 동작한다.
* bisect_left(a,x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 X를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
* bisect_right(a,x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
예를 들어 정렬된 리스트 [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]
x = 4
print(bisect_left(a,x)) # 2
print(bisect_right(a,x)) # 4
bisect_left()와 bisect_right()는 정렬된 리스트에서 특정 범위에 속한 원소의 개수를 구하고자 할 때 효과적으로 사용될 수 있다.
아래 함수에서 count_by_range(a, left_value, right_value) 함수는 정렬된 리스트에서 [left_value, right_value]에 속하는 데이터의 개수를 O(logN)의 시간 복잡도로 반환한다.
from bisect import bisect_left, bisect_right
# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 개수
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]
# 값이 4인 데이터 개수 출력
print(count_by_range(a,4,4)) # 2
# 값이 [-1,3] 범위에 있는 데이터 개수 출력
print(count_by_range(a,-1,3)) # 6
5. collections
collections 라이브러리는 유용한 자료구조를 제공하는 표준 라이브러리이다. 유명한 라이브러리로는 deque와 Counter가 있다.
이또한 한 번 정리한 적이 있기 때문에 코드로만 확인하고자 한다.
deque : kom-story.tistory.com/13?category=912027
counter : kom-story.tistory.com/27
from collections import deque
data = deque([2,3,4])
data.appendleft(1)
data.append(5)
print(data)
print(list(data))
# deque([1,2,3,4,5])
# [1,2,3,4,5]
Counter : 등장 횟수를 세는 기능을 제공한다. 구체적으로 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지 알 수 있다.
from collections import Counter
counter = Counter(['red','blue','red','green','blue','blue'])
print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(counter['green']) # 'green'이 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 변환
# 3
# 1
# {'red' : 2, 'blue' : 3, 'green' : 1}
6. math
math는 자주 사용되는 수학적인 기능을 포함하고 있는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수 GCD 등을 계산해주는 기능을 포함하고 있으므로, 수학 계산을 요구하는 문제를 만났을 때 효과적으로 사용이 가능하다.
import math
print(math.factorial(5)) # 120
print(math.sqrt(7)) # 2.64575
print(math.gcd(21,14)) # 7
print(math.pi) # 3.141592
print(math.e) # 2.71828
앞으로 이 책을 활용해서 파이썬을 이용한 알고리즘을 하나씩 공부해보고자 한다!!!
'TIL > 코테개념_python' 카테고리의 다른 글
[python] 강력한 정규 표현식 뿌시기 (0) | 2021.01.07 |
---|---|
[python] 정규 표현식 시작하기 뿌시기 (0) | 2021.01.07 |
[python] 예외 처리 뿌시기 (0) | 2021.01.07 |
[python] 패키지 뿌시기 (0) | 2021.01.07 |
[python] 모듈 뿌시기 (0) | 2021.01.07 |