Algorithm/theory

코딩테스트를 위한 python 문법

takeU 2021. 9. 1. 21:07
반응형

코딩테스트를 위한 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