낮을 수록 좋은 알고리즘!
시간 복잡도
가장 빠르게 증가하는 항만을 고려하는 표기법(극한!)
일반적으로 연산 횟수가 5억을 넘어가는 경우 : Python 기준 통상 5~15초 가량의 시간이 소요됨
코테 문제에서 시간 제한은 통상 1~5초 가량임
e나 E로 지수 표현할 수 O
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i %2 ==1]
# 1부터 9까지의 수들의 제곱 값을 포함하는 리스트
array = [i*i for i in range(1,10)]
# 2차원 리스트 초기화
array = [[0]*m for _ in range(n)]
array = [[0]*m]*n
+
사용해서 문자열 연결 가능(Concatenate)()
사용a = (1,2,3,4,5)
print(a[3] #결과 4
Key와 Value 쌍을 데이터로 가지는 자료형
변경 불가능한(Immutable) 자료형을 키로 사용할 수 있음
파이썬의 사전 자료형은 Hash Table을 사용 → 데이터의 조회 및 수정에 있어 O(1) 시간에 처리 가능
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
print(data)
#결과 : {'사과':'Apple', '바나나':'Banana'}
data = {
'사과' : 'Apple',
'바나나' : 'Banana'
} #이렇게 초기화도 가능
if '사과' in data:
print("사과를 키로 가지는 데이터 존재함")
# 결과 : 사과를 키로 가지는 데이터 존재함
키(Key) | 값(Value) |
---|---|
사과 | Apple |
바나나 | Banana |
keys()
함수 : key 데이터만 뽑아서 리스트로 사용
values()
함수 : value 데이터만 뽑아서 리스트로 사용
key_list = data.keys()
value_list = data.values()
print(key_list)
print(value_list)
#결과 : ['사과', '바나나']
# ['Apple', 'Banana']
for key in key_list :
print(data[key])
#결과 : Apple
# Banana
중복 허용 X
순서 X
→ 따라서 데이터의 존재 유무 체크시 사용
초기화 방법
set()
함수 사용{}
안에 ,
를 기준으로 구분하여 삽입하여 초기화데이터의 조회 및 수정에 있어 O(1) 시간에 처리 가능
data = set([1, 1, 2, 2, 2]) #중복 제거됨
# 결과 : {1,2}
data = {1, 1, 2, 2, 2} #중복 제거됨
# 결과 : {1,2}
|
, 교집합 &
, 차집합 -
사용 가능add()
함수 : 새로운 원소 추가 update()
함수 : 새로운 원소 여러개 추가remove()
함수 : 특정 값을 갖는 원소 삭제input()
함수 : 한 줄의 문자열을 입력 받는 함수
map()
함수 : 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
list(map(int, input().split()))
a, b, c = map(int, input().split())
sys.stdin.readline()
메서드를 이용rstrip()
메서드를 함께 사용import sys
# 문자열 입력 받기
data = sys.stdin.readline().rstrip()
print(data)
end
속성 이용 가능# 출력할 변수들
a = 1
b = 2
print(a, b)
print(7, end=" ")
print(8, end=" ")
# 출력할 변수
answer = 7
print(" 정답은 " + str(answer) + "입니다.")
>>> 1 2
>>> 7 8 정답은 7입니다.
answer = 7
print(f"정답은 {answer}")
>>> 정답은 7
아무것도 처리하고 싶지 않을 때 pass
사용
score = 85
if score >= 80:
pass # 나중에 작성할 소스코드
else:
print("성적이 80점 미만입니다.")
print("프로그램을 종료합니다.")
#결과 : 프로그램을 종료합니다.
continue
를 사용#1부터 9까지의 홀수의 합을 구하기
result = 0
for i in range(1, 10):
if i % 2 == 0:
continue # 건너뛰기
result += i
print(result)
# 학생들의 합격 여부 판단
# 특정 번호의 학생은 제외하기
scores = [90, 85, 77, 65, 97]
cheating_student_list = {2, 4}
for i in range(5):
if i + 1 in cheating_student_list:
continue
if scores[i] >= 80:
print(i + 1, "번 학생은 합격입니다.")
#결과: 1 번 학생은 합격입니다.
# 5 번 학생은 합격입니다.
break
를 사용#1부터 5까지의 정수를 차례대로 출력
i = 1
while True:
print("현재 i의 값:", i)
if i == 5:
break
i += 1
def sub(a, b):
print('함수의 결과:', a - b)
sub(b = 3, a = 7)
# 함수의 결과: 4
global
키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 됨global
을 쓰지 않을 경우, 함수는 지역변수를 우선적으로 처리함a = 10
def func():
global a #전역 변수
a += 1
print(a)
func()
# 11
def operator(a, b):
add_var = a + b
subtract_var = a - b
multiply_var = a * b
divide_var = a / b
return add_var, subtract_var, multiply_var, divide_var
a, b, c, d = operator(7, 3)
print(a, b, c, d)
def add(a, b):
return a + b
# 일반적인 add() 메소드 사용
print(add(3, 7))
# 람다 표현식
print((lambda a, b: a + b)(3, 7))
# 내장 함수에서 자주 사용되는 람다 함수
#튜플형태 리스트를 정수 기준으로 정렬하기
array = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]
def my_key(x):
return x[1]
#key 속성 = 정렬 기준
print(sorted(array, key=my_key)
#위와 같은 결과~
print(sorted(array, key=lambda x: x[1]))
# [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
# [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
# 여러 개의 리스트에 동일한 규칙 적용
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]
#a,b 변수가 있을 때 a+b 구하기 -> a,b는 각각 list1, list2에서 가져옴
result = map(lambda a, b: a + b, list1, list2)
print(list(result))
# [7, 9, 11, 13, 15]
itertools
: 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공heapq
: 힙(Heep) 자료구조를 제공bisect
: 이진 탐색(Binary Search) 기능을 제공collections
: 덱(Deque), 카운터(Counter) 등의 유용한 자료구조를 포함math
: 필수적인 수학적 기능을 제공# sum()
result = sum([1, 2, 3, 4, 5])
print(result)
# min(), max()
min_result = min(7, 3, 5, 2)
max_result = max(7, 3, 5, 2)
print(min_result, max_result)
# eval()
result = eval("(3+5)*7")
print(result)
# 15
# 2 7
# 56
# sorted()
result = sorted([9, 1, 8, 5, 4])
reverse_result = sorted([9, 1, 8, 5, 4], reverse=True)
print(result)
print(reverse_result)
# sorted() with key
array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key=lambda x: x[1], reverse=True)
print(result)
# [1, 4, 5, 8, 9]
# [9, 8, 5, 4, 1]
# [('이순신', 75), ('아무개', 50), ('홍길동', 35)]
# 순열 : 서로 다른 n개에서 서로 다른 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')]
# 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
from itertools import combinations
data = ['A', 'B', 'C'] # 데이터 준비
result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기
print(result)
# [('A','B'), ('A','C'), ('B','C')]
from collections import Counter
counter = Couter(['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}
gcd()
함수 이용 가능import math
# 최소 공배수(LCM)를 구하는 함수
def lcm(a, b):
return a * b // math.gcd(a, b)
a = 21
b = 14
print(math.gcd(21, 14)) # 최대 공약수(GCD) 계산
print(lcm(21, 14)) # 최소 공배수(LCM) 계산
# 7
# 42