복답도는 알고리즘의 성능을 나타내는 기준
- 시간 복잡도 : 알고리즘의 수행시간 분석
- 공간 복잡도 : 알고리즘의 메모리 사용량 분석
동일한 기능을 수행하는 알고리즘이 있다면, 일반적인 경우 복잡도가 낮을수록 좋은 알고리즘
가장 빠르게 증가하는 항만을 고려하는 표기법
- 함수의 상한만을 나타냄
예. 인 알고리즘이 존재
- 빅오 표기법에서는 차수가 가장 큰 항만 남기므로 로 표기
왼쪽에서 오른쪽으로 갈수록 더 성능이 떨어져요.
(상수함수<로그함수<선형함수<다항함수<지수함수)
빅오 표기법에서 실제 사용되는 로직들이 어떤게 있는지 간단한 예시만 볼게요.
[예제1]
arrary = [3,5,1,2,4]
summary = 0
for x in array:
summary += x
print(summary)
[예제2]
array = [3,5,1,2,4]
for i in array:
for j in array:
temp = i*j
print(temp)
하나. 지문읽기 및 컴퓨터적 사고
둘. 요구사항(복잡도) 분석
셋. 문제 해결을 위한 아이디어 찾기
넷 소스코드 설계 및 코딩
import time
start_time = time.time() # 측정 시작
# 프로그램 소스 코드
end_time = time.time() # 측정 종료
print('시간 - ', end_time - start_time) # 수행시간 출력
1억을 표기할때 통상 숫자를 100,000,000
이렇게 하드 코딩하는 경우가 있는데요. 지수 표현 방식을 이용하면 더 간단해요.
바로 e
orE
를 이용하는 지수 표현 방식이 있어요.
예. 1e9라고 입력하게 되면, 10의9제곱(1,000,000,000)
, 10억이 됩니다.
지수 표현 방식은 임의의 큰 수를 표현하기 위해 자주 사용
최단 경로 알고리즘에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정
이때 가능한 최댓값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용
>>> 1e9
1000000000.0
>>> 75.25e1
752.5
>>> 3954e-3
3.954
>>>
실수 정보를 표현하는 정확도에 한계
를 가져요.0.3+0.6= 0.9
떨어짐2진수에서는 표현방법이 없음
컴퓨터는 최대한 0.9에 가깝게 표현하지만, 미세한 오류 발생
>>> a = 0.3+0.6
>>> a
0.8999999999999999
>>> if a ==0.9:
... print('0.9입니다')
... else:
... print('0.9가 아니라는데요?!')
...
0.9가 아니라는데요?!
>>>
이럴 때는 round()함수를 이용!!
round(123.456,2)
123.46
출력!>>> a = 0.3+0.6
>>> round(a,4)
0.9
>>> if round(a,4) == 0.9:
... print('0.9출력')
... else:
... print('0.9아님')
...
0.9출력
>>>
:
:
: for
O(n log n)
O():
O()
이름 | 사용법 | 시간복잡도 | |
---|---|---|---|
append | 변수명.append() | O(1) | |
sort() | 변수명.sort() | ||
sort() | 변수명.sort(reverse=True) | ||
reverse() | 변수명.reverse() | ||
insert() | insert(삽입할 위치 인덱스, 삽입할 값) | ||
count() | 변수명.count(특정값) | ||
remove() | 변수명.remove(특정값) |
서로 다른 성질
의 데이터를 묶어서 관리메모리를 효율적으로 사용
해야 할 때변경 불가능한(임뮤터블) 자료형
을 키로 사용 할 수 있음리스트 또는 문자열을 이용해서 초기화
가능# 집합자료 초기화 방법1
>>> data = set([1,1,1,1,1,1,1,2,3,4,5])
>>> data
{1, 2, 3, 4, 5}
# 집합 자료 초기화 방법2
>>> data = {1,1,1,1,1,1,1,1,1,2,3}
>>> data
{1, 2, 3}
인덱싱
을 통해 자료형의 값을 얻을 수 있습니다. 순서가 없기 때문에ㅐ
인덱싱으로 값을 얻을 수 없습니다. input()
함수는 한 줄의 문자열을 입력받는 함수map()
함수는 리스트의 모든 원소에 각각 특정한 함수를 적요할 때 사용list(map(int, input().split()))
a, b, c = map(int, input().split())
입력을 최대한 빠르게 받아야 하는 경우
sys
라이브러리에 정의되어 있는 sys.stdin.readline()
메서드를 이용합니다. rstrip()
메서드를 함께 사용합니다.import sys
data = sys.stdin.readline().rstrip() # 대부분 이렇게 묶음으로 사용합니다.
print(data)
score = 85
if score>=80: result = 'Success'
else: result = 'Fail'
if~else문을 한줄
에 작성 할 수 있게 해줘요.score = 85
result = 'Success' if score >= 80 else 'Fail'
>>> def operator(a,b):
... one = a+b
... two = a-b
... three = a*b
... four = a/b
... return one, two, three, four
...
>>> a,b,c,d = operator(7,3)
>>> print(a,b,c,d)
10 4 21 2.3333333333333335
def add(a,b):
return a+b
print(add(3,7))
print((lambda a,b: a+b)(3,7))
print((lambda a,b: (a*b//math.gcd(a,b)) (3,4)
>>> array = [('홍길동', 50),('홍길동', 50),('홍길동', 50) ]
>>>
>>> def my_key(x):g
... return x[1]
...
>>> print(sorted(array, key=my_key))
[('홍길동', 50), ('홍길동', 50), ('홍길동', 50)]
>>> print(sorted(array, key=lambda x: x[1]))
[('홍길동', 50), ('홍길동', 50), ('홍길동', 50)]
>>> list1 = [1,2,3,4,5]
>>> list2 = [6,7,8,9,10]
>>>
>>> result = map(lambda a,b: a+b, list1, list2)
>>>
>>> print(list(result))
[7, 9, 11, 13, 15]
>>>
순열
: 서로 다른 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, 3)) # 2개를 뽑는 모든 조합 구하기
>>> print(result)
[('A', 'B', 'C')]
from itertools import product
data = ['A','B','C'] # 데이터 준비
result = list(product(data, repeat=2)) # 2개를 뽑는 순열 구하기(중복 허용)
print(result)
from itertools import combinations_with_replacement
data = ['A','B','C'] # 데이터 준비
result = list(combinations_with_replacement(data, repeat=2)) # 2개를 뽑는 조합 구하기(중복 허용)
print(result)
>>> from collections import Counter
>>>
>>> counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
>>>
>>> print(counter['blue'])
3
>>> print(counter['green'])
1
>>> print(dict(counter))
{'red': 2, 'blue': 3, 'green': 1}
import math
def lcm(a,b):
return a * b //math.gcd(a,b)
a = 2
b = 14
print(math.gcd(21,14)) # 최대 공약수 계산
print(lcm(21,14)) # 최대 공약수 계산