반응형
코딩테스트를 위한 python 문법
코테 언어를 고민하다 파이썬으로 정착하기로 생각하면서 필요한 문법 정리
출처: 이코테
숫자 자료형 ( Number )
정수형
a = 1
b = 0
c = -1
print(a, b, c) # 1 0 -1
실수형
a = 1.23
b = 3.
c = -13.2
print(a, b, c) # 1.23 3.0 -13.2
# 지수형
d = 1e4
e = 3000e-2
print(d, e) # 10000.0 30.0
컴퓨터의 시스템은 수 데이터를 처리할 때 2진수를 이용하며, 실수를 처리할 때 부동 소수점 방식을 이용한다.
2진수 체계 소수계산의 오차가 발생하는 대표적인 예시로는 0.3 + 0.6 이 0.8999999999999999 이 나오는 경우이다. 파이썬에서 이를 처리하는 방법으로는 round()
함수(반올림)를 이용한다.
a = 0.3 + 0.6
print(a, round(a)) # 0.8999999999999999 1
연산
a = 1
b = 2
print(a / b) # 나누기 0.5
print(a % b) # 나머지 1
print(a // b) # 몫 0
print(a ** b) # 거듭제곱 1
리스트 자료형 ( List )
c++의 vector, JS의 array와 유사함
선언
a = [1, 2, 3, 4]
print(a) # [1,2,3,4]
인덱싱, 슬라이싱
a = [1, 2, 3, 4]
# 인덱싱
print(a[0]) # 1
print(a[-1]) # 4
print(a[-2]) # 3
# 변경
a[3] = 5
print(a) # [1, 2, 3, 5]
# 슬라이싱
print(a[1:3]) # [2, 3]
print(a[:-1]) # [1, 2, 3]
print(a[1:-1]) # [2, 3]
리스트 컴프리헨션 ( list comprehension )
# 1차원 리스트 초기화
a = [0] * 5
print(a) # [0, 0, 0, 0, 0]
# 2차원 리스트 초기화
a = [[0] * 5 for _ in range(3)]
print(a) # [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
# 1~9 중 홀수인 제곱수 리스트
a = [i**2 for i in range(1, 10) if i % 2 == 1] # [1, 9, 25, 49, 81]
리스트 메소드
a = [2, 3, 4]
# 추가
a.append(1) # [2, 3, 4, 1]
# 정렬
a.sort() # 오름차순 [1, 2, 3, 4]
a.sort(reverse = True) # 내림차순 [4, 3, 2, 1]
a.reverse() # 뒤집기 [1, 2, 3, 4]
# 삽입 (idx, value)
a.insert(1, 2) # [1, 2, 2, 3, 4]
# 개수
a.count(2) # 2
# 제거 ( 앞에서 가장 먼저 나오는 하나만 제거)
a.remove(2) # [1, 2, 3, 4]
문자열 자료형 ( String )
# 선언
a = 'Hi'
print(a) # Hi
# 연산
b = 'Bye'
print(a + " " + b) # Hi Bye
# 반복
print(a * 3) # HiHiHi
# 슬라이싱
print(b[1:3]) # ye
튜플 자료형 ( Tuple )
# 선언
a = (1, 2, 3, 4)
print(a) # (1, 2, 3, 4)
# 선언 후 변경 불가
a[2] = 3 # 'tuple' object does not support item assignment
딕셔너리 자료형 ( Dictionary )
key: value
쌍
data = {}
data['a'] = 'aaa' # { 'a': 'aaa' }
data['b'] = 'bbb' # { 'a': 'aaa', 'b': 'bbb' }
# key
data.keys() # dict_keys(['a', 'b'])
# value
data.values() # dict_values(['aaa', 'bbb'])
셋 자료형 ( Set )
중복 불가, 순서 없음
data = set([1, 1, 2])
print(data) # { 1, 1, 2 }
data = { 1, 1, 2 }
print(data) # { 1, 1, 2 }
연산
a = { 1, 2, 3 }
b = { 3, 4, 5 }
# 합집합
print(a | b) # {1, 2, 3, 4, 5}
# 교집합
print(a & b) # { 3 }
# 차집합
print(a - b) # { 1, 2 }
메소드
a = { 1, 2, 3 }
# 추가
a.add(4) # { 1, 2, 3, 4 }
# 여러 개 추가
a.update([5, 6]) # { 1, 2, 3, 4, 5, 6 }
# 삭제
a.remove(3) # { 1, 2, 4, 5, 6}
조건문
if con:
elif con:
else:
1 in [1, 2, 3] # True
4 not in [1, 2, 3] # True
반복문
# while
while con:
# for
for var in list:
함수
# 함수
def add(a, b):
return a + b
add(1, 2) # 3
# lambda 표현식
add = lambda a, b: a + b
add(1, 2) # 3
입출력
# 개수
n = int(input())
# 데이터
data = list(map(int, input().split()))
# readline 사용시
import sys
data = sys.stdin.readline().rstrip()
주요 라이브러리
내장함수
# 합
sum([1, 2, 3]) # 6
# 최소값, 최대값
min(1, 2, 3) # 1
max(1, 2, 3) # 3
# 문자열 > 수식
eval("3+5") # 8
# key 정렬
sorted([('에이', 5), ('비', 1), ('씨', 2)], key = lambda x: x[1])
# [('비', 1), ('씨', 2), ('에이', 5)]
itertools
- 순열, 조합
# 순열
from itertools import permutations
a = ['A', 'B', 'C']
res = list(permutations(a, 3))
print(res)
# [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
# 조합
from itertools import combinations
a = ['A', 'B', 'C']
res = list(combinations(a, 2))
print(res)
# [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
# 중복순열
from itertools import product
a = ['A', 'B', 'C']
res = list(product(a, repeat = 2))
print(res)
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
# 중복조합
from itertools import combinations_with_replacement
a = ['A', 'B', 'C']
res = list(combinations_with_replacement(a, 2))
print(res)
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
heapq
- 힙, 우선순위큐
파이썬의 힙은 최소힙으로 구성되어 있어서, 원소 전체를 힙에 넣었다 빼는 것으로 오름차순 정렬이 안료됨. ( O(NlogN))
# 추가
heapq.heappush()
# 제거
heapq.heappop()
# 정렬
import heapq
def heapsort(iterable):
h = []
res = []
for value in iterable:
heapq.heappush(h, value) # (h, -value)
for i in range(len(h)):
res.append(heapq.heappop(h)) # ( -heapq.heappop(h) )
return res
res = heapsort([1,3,5,7,9,2,4,6])
print(res) # [1, 2, 3, 4, 5, 6, 7, 9]
#반대로 내림차순의 경우엔 푸시와 팝의 부호를 바꾸는 방법으로 진행
bisect
- 이진 탐색
이진탑색 / 정렬된 배열에서 효과적으로 사용 가능
배열 a
에서 각각 왼쪽과 오른쪽에서 삽입할 원소 x
의 인덱스를 찾는 함수
bisect_left(a, x)
bisect_right(a, x)
collections
- 덱, 카운터
덱(deque) - 인덱싱, 슬라이싱 불가능 / 데이터의 시작과 끝 부분 데이터 추가/삭제가 용이
from collections import deque
data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)
print(data) # deque([1, 2, 3, 4, 5])
카운터(counter) - 개수
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue'])
print(counter['blue']) # 2
print(dict(counter)) # {'red': 2, 'blue': 2, 'green': 1 }
math
- 팩토리얼, 제곱근, gcd, 삼각함수, 수학 상수
import math
print(math.factorial(5)) # 120
print(math.sqrt(4)) # 2.0
print(math.gcd(25, 15)) # 5