-
코딩테스트를 위한 Python 문법 정리Algorithm 2023. 2. 3. 14:30
1. 자료형
수 자료형
데이터는 모두 수로 표현할 수 있다.
정수형
- 정수를 다루는 자료형
- 양의 정수, 음의 정수, 0이 있다.실수형
- 소수점 아래의 데이터를 포함하는 수 자료형으로 파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리한다.
- 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있다.
- 실수형 데이터를 표현하는 방식으로 파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용할 수 있다. e 다음에 오는 수는 10의 지수부를 의미한다. ex) le9 는 10의 9제곱이 된다.
- 최단 경로 문제에서는 도달할 수 없는 노드에 대하여 거리를 ‘무한(INF)’으로 설정하곤 한다. 최댓값이 10억 미만이라면 무한(INF)을 표현할 때 10억을 사용할 수 있다. -> 이때 일일이 10억을 특정 변수에 대입하는 일은 번거로워 지수 표현 방식인 le9로 표현할 수 있는 것이다.
- 또한 큰 수를 표현할 때, 0의 개수가 많아지게 되면 자릿수가 헷갈리는 경우가 많기 때문에 10억을 코드에 입력하는 것 보다는 le9로 표현하는 것이 실수할 확률이 적다.
- 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어지지만, 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없다. -> 따라서 소수점 값을 비교하는 작업이 필요한 문제라면 round()함수를 이용할 수 있다.
- round() 함수를 호출할 때 첫 번째 인자는 실수형 데이터이고, 두 번째 인자는 (반올림하고자 하는 위치 -1) 이다.
수 자료형의 연산
-
a=7 b=3 #나누기 print(a/b) #나머지 print(a%b) #몫 print(a//b)
리스트 자료형
- 리스트는 여러개의 데이터를 연속적으로 담아 처리하기 위해 사용할 수 있다.
- 내부적으로 연결 리스트 자료구조를 채택하고 있어서 append(), remove() 등의 메서드를 지원한다.리스트 만들기
- 리스트는 대괄호([])안에 원소를 넣어 초기화하며, 쉼표(,)로 원소를 구분한다.
- 비어있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 대괄호([])를 이용할 수 있다.
- 비어있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 대괄호([])를 이용할 수 있다.
#빈 리스트 선언 방법 a= list() a=[] #크기가 N이고, 모든 값이 0인 1차원 리스트 초기화 n=10 a=[0]*n
리스트의 인덱싱과 슬라이싱
- 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱이라고 한다.
- 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱이라고 한다.
#뒤에서 세 번째 원소 출력 print(a[-3]) #두 번째 원소부터 네 번째 원소까지 슬라이싱 print(a[1:4])
리스트 컴프리헨션
- 리스트를 초기화하는 방법 중 하나이다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다.
#0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [i for i in range(20) if i%2==1] array = [i for i in range(20) if i%2==1] #1부터 9까지의 수의 제곱 값을 포함하는 리스트 array = [i*i for i in range(1,10)]
- 이러한 리스트 컴프리헨션은 코딩테스트에서 2차원 리스트를 초기화 할 때 매우 효과적으로 사용될 수 있다.
- 이러한 리스트 컴프리헨션은 코딩테스트에서 2차원 리스트를 초기화 할 때 매우 효과적으로 사용될 수 있다.
#N X M 크기의 2차원 리스트 초기화 n=3 m=4 array=[[0]*m for _ in range(5)]
리스트 관련 기타 메서드
- append() -리스트에 원소를 하나 삽입할 때 사용한다 O(1)
- sort() - 기본 정렬 기능으로 오름차순으로 정렬 O(NlogN)
- sort(reverse=TRUE) - 내림차순으로 정렬 O(NlogN)
- reverse() - 리스트의 원소의 순서를 모두 뒤집어 놓는다 O(N)
- insert() - 특정한 인덱스 위치에 원소를 삽입할 때 사용한다 O(N)
- count() - 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용한다 O(N)
- remove() - 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다 O(N)
문자열 자료형
- 문자열 초기화
- 문자열 변수를 초기화할 때는 큰따옴표(“)나 작은따옴표(‘)를 이용한다.
- 문자열 연산
- 문자열 변수에 덧셈(+)을 이용하면 단순히 문자열이 더해져서 연결된다.
- 문자열 변수를 양의 정수와 곱하는 겨우, 문자열이 그 값만큼 여러 번 더해진다.
- 파이썬 문자열은 내부적으로 리스트와 같이 처리된다. 문자열은 여러 개의 문자가 합쳐진 리스트라고 볼 수 있다.
data=dict() data['사과']='Apple' data['바나나']='Banana' data['코코넛']='Coconut' print(data) => {'사과':'Apple', '바나나':'Banana','코코넛':'Coconut'}
튜플 자료형
- 파이썬의 튜플 자료형은 리스트와 거의 비슷한데 다음과 같은 차이가 있다.
- 튜플은 한 번 선언된 값을 변경할 수 없다.
- 리스트는 대괄호([])를 이용하지만, 튜플은 소괄호 (())를 이용한다.
사전 자료형
- 사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다.
- 앞서 다루었던 리스트나 튜플은 값을 순차적으로 저장한다는 특징이 있다. 하지만 사전 자료형은 키-값 쌍을 데이터로 가진다는 점에서, 우리가 원하는 변경 불가능한 데이터를 키로 사용할 수 있다.
사전 자료형 관련 함수
키 데이터만 뽑아서 리스트로 이용할 때는 keys() 함수를 이용하며, 값 데이터만을 뽑아서 리스트로 이용할 때는 values() 함수를 이용한다.
#키 데이터만 담은 리스트 key_list = data.keys() #값 데이터만 담은 리스트 value_list = data.values() 결과 dict_keys(['사과','바나나','코코넛']) dict_values(['Apple','Banana','Coconut'])
1. 집합 자료형
- 중복을 허용하지 않는다.
- 순서가 없다.
- ‘특정한 데이터가 이미 등장한 적이 있는지 여부’를 체크할 때 매우 효과적이다.
#집합 자료형 초기화 방법1 data = set([1,1,2,3,4,4,5]) #집합 자료형 초기화 방법2 data={1,1,2,3,4,4,5} 집합 자료형의 연산 a = set([1,2,3,4,5]) b = set([3,4,5,6,7]) #합집합 a|b => {1,2,3,4,5,6,7} #교집합 a&b => {3,4,5} #차집합 a-b => {1,2} #새로운 원소 추가 data.add(4) #새로운 원소 여러 개 추가 data.update([5,6]) #특정한 값을 갖는 원소 삭제 data.remove(3)
2. 조건문
파이썬에서 조건문을 작성할 때는 if ~ elif ~ else문을 이용한다. 조건문을 사용할 때 elif 혹은 else 부분은 경우에 따라서 사용하지 않아도 된다.
if 조건문 1: 조건문 1이 True일 때 실행되는 코드 elif 조건문 2: 조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행되는 코드 else: 위의 모든 조건문이 모두 True 값이 아닐 때 실행되는 코드 #조건부 표현식 score=85 result = "Success" if score >=80 else "Fail" #리스트에 있는 원소의 값을 변경해서 또 다른 리스트 생성 a=[1,2,3,4,5,5,5] remove_set={3,5} result = [i for i in a if i not in remove_set] print(result) => [1,2,4]
3. 반복문
for문
in 뒤에 오는 데이터에 포함되어 있는 모든 원소를 첫 번째 인덱스부터 차례대로 하나씩 방문한다. in 뒤에 오는 데이터로는 리스트, 튜플, 문자열 등이 사용될 수 있다.
for 변수 in 리스트: 실행할 소스코드 #i는 1부터 9까지의 모든 값을 순회 for i in range(1, 10): result +=i; #range()의 값으로 하나의 값만을 넣으면, 자동으로 시작 값은 0이 된다 for i in range(5): result +=i;
while문
while문은 조건문이 참일 때에 한해서, 반복적으로 코드가 수행된다.
#i가 9보다 작거나 같을 때 아래 코드를 반복적으로 실행 while i <= 9: if i % 2 ==1: result += i i += 1
4. 함수
동일한 알고리즘을 반복적으로 수행해야 할 때 함수는 중요하게 사용된다.
def 함수명(매개변수): 실행할 소스코드 return 반환 값 def add(a,b): print('함수의 결과:', a+b) add(b=3,a=7) -> 함수의 결과: 10 #람다 표현식으로 구현한 add() 메서드 print((lambda a,b: a+b)(3,7))
5. 입출력
일반적으로 입력 과정에서는 먼저 데이터의 개수가 첫 번째 줄에 주오지고, 처리할 데이터는 그다음 줄에 주어지는 경우가 많다.
#데이터의 개수 입력 n= int(input()) #각 데이터를 공백으로 구분하여 입력 data = list(map(int,input().split()) data.sort(reverse=True) => [99,90,75,65,34]
파이썬의 기본 input() 함수는 동작 속도가 느려서 시간 초과로 오답 판정을 받을 수 있기 때문에 sys라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용한다.
import sys data= sys.stdin.readline().rstrip()
주요 라이브러리의 문법과 유의점
- 표준 라이브러리란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.
- 내장 함수: print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다.
- itertools: 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.
- heapq: 힙(Heap) 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용된다.
- visect: 이진 탐색 기능을 제공하는 라이브러리이다.
- collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.
- math: 필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수, 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함하고 있다.
1. 내장 함수
- 별도의 import 명령어 없이 바로 사용할 수 있는 내장 함수 (input, print)
- sum()
result = sum([1,2,3,4,5]) => 15
- min()
result = min(7,3,5,2) => 2
- max()
result = max(7,3,5,2) => 7
- eval()
result = eval("(3+5)*7") => 56
- sorted()
result = sorted([9,1,8,5,4]) #오름차순 정렬 result = sorted([9,1,8,4,5], reverse = True) #내림차순 정렬 #파이썬에서는 리스트의 원소로 리스트나 튜플이 존재할 때 특정한 기준에 따라서 정렬을 수행할 수 있다. result = sorted([('홍길동',35),('이순신',75)], key=lambda x: x[1], reverse= True)
2. itertools
- itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리이다.
- 가장 유용하게 사용할 수 있는 클래스는 permutations, combinations이다.
- permutations (순열)
from itertools import permutations data= ['A','B','C'] result = list(permutations(data,3)) #모든 순열 구하기
- combinations(조합)
from itertools import combinations data=['A','B','C'] result = list(combinations(data,2)) #2개를 뽑는 모든 조합 구하기
3. heapq
- heapq는 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용된다.
- 힙에 원소를 삽입할 때는 heapq.heappush() 메서드를 이용하고, 힙에서 원소를 꺼내고자 할 때는 heapq.heappop() 메서드를 이용한다.
4. bisect
- bisect 라이브러리는 ‘정렬된 배열’에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.
- bisect_left() 함수와 bisect_right() 함수가 가장 중요하게 사용되며, 이 두 함수는 시간 복잡도 O(logN)에 동작한다.
- bisect_left(a,x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
- bisect_right(a,x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
5. collections
- 보통 파이썬에서는 deque를 사용해 큐를 구현한다.
- deque는 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때 매우 효과적으로 사용될 수 있다.
- deque는 스택이나 큐의 기능을 모두 포함한다고도 볼 수 있기 때문에 스택 혹은 큐 자료구조의 대용으로 사용될 수 있다.
- 첫 번째 원소를 제거할 때 popleft()를 사용하며, 마지막 원소를 제거할 때 pop()을 사용한다.
- 첫 번째 인덱스에 원소 x를 삽입할 때 appendleft(x)를 사용하며, 마짐가 인덱스에 원소를 삽입할 때 append(x)를 사용한다.
- Counter는 등장 횟수를 세는 기능을 제공한다.
from collections import Counter counter = Counter(['red','blue','red','green','blue','blue']) print(count['blue']) #'blue'가 등장한 횟수 출력 => 3 print(dict(counter)) #사전 자료형으로 변환 => {'red':2, 'blue':3, 'green':1}
6. math
- 수학 계산을 요구하는 문제를 만났을 때 효과적으로 사용될 수 있다.
import math print(math.factorial(5)) #5팩토리얼을 출력 => 120 print(math.sqrt(7)) #7의 제곱근을 출력 => 2.6457513... print(math.gcd(21,14)) #최대공약수 츨력 => 7 print(math.pi) #파이(pi)출력 => 3.141592653589793 print(math.e) #자연상수 e
'Algorithm' 카테고리의 다른 글
최대 연속 부분배열 알고리즘 (0) 2023.02.03 BFS(너비 우선 탐색) - 백준 1697, 5014 (0) 2023.01.25 냅색(배낭) 알고리즘 (0) 2023.01.24