파이썬 알고리즘 공부를 하면서 여러가지 유용하고, 헷갈리는 문법들 정리
#1 시간, 공간 복잡도 관련 팁
알고리즘 수행시간을 알아보기 위한 코드
import time
start_time = time.time()
end_time = time.time()
print("time :", end_time - start_time)
- pypy3는 파이썬3의 문법을 그대로 지원하며, 대부분 파이썬3보다 실행 속도가 더 빠르다. Pypy3를 지원하는 환경이라면 속도를 줄이기 위해 이를 이용하도록 하자
- 기업코딩 테스트 환경에서는 파이썬으로 제출한 코드가 1초에 2000만번 연산을 수행한다고 가정하면 크게 무리가 없다.
- 시간제한이 1초인 문제를 만났을 경우 (참고만 하세요)
N의 범위 |
최소 시간 복잡도 |
500 |
O(N^3) |
2,000 |
O(N^2) |
100,000 |
O(NlogN) |
10,000,000 |
O(N) |
- 일반적으로 탐색해야할 전체 데이터의 개수가 100만개 이하일 때 완전탐색을 사용하면 적절하다.
- 정수형 자료형 데이터의 개수에 따른 메모리 사용량
데이터의 개수(리스트의 길이) |
메모리 사용량 |
1,000 |
약 4KB |
1,000,000 |
약 4MB |
10,000,000 |
약 40MB |
#2 입출력
공백을 기준으로 입력받기
n, m, k = map(int, input().split())
data = list(map(int, input().split()))
2차원 배열 입력받기
data = []
for i in range(n):
data.append(list(map(int, input())))
data.append(list(map(int, input().split())))
빠르게 입력받기 (일반적인 입력 방식보다 더 효율적)
import sys
data = sys.stdin.readline().rstrip()
f-string (더 간결하게 여러 자료형을 한 줄로 출력할 수 있음)
num = 7
print(f"정답은 {num}입니다.")
#3 정렬
B.sort(reverse=True)
s_list.sort(key = lambda x : (-x[1], x[2], -x[3], x[0]))
s_list.sort(key = lambda x : (-int(x[1]), int(x[2]), -int(x[3]), x[0] ))
data[(n-1) // 2]
array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key = lambda x: x[1])
s = 'abcde'
print(s[::-1])
print(s[3:0:-1])
l = ['a', 'b', 'c', 'd', 'e']
print(l[::-1])
t = ('a', 'b', 'c', 'd', 'e')
print(t[::-1])
#4 문자열, 배열 다루기
파이썬 문자열 아스키변환
주요 아스키 코드값 0 ~ 9 : 48 ~ 57 , A ~ Z : 65 ~ 90, a ~ z : 97 ~ 122
ord('a')
chr(ord('a'))
크기가 N이고 모든 값이 0인 리스트 초기화
N = 10
arr = [0] * N
1부터 10까지 증가하는 리스트 초기화
array = [i for i in range(1, 11)]
2차원 배열 좌표 이동
n = int(input())
x, y = 1,1
plans = input().split()
dx = [0, 0, -1, 1]
dy = [-1,1, 0, 0]
move = ['L', 'R', 'U', 'D']
for plan in plans:
for i in range(len(move)):
if plan == move[i]:
nx = x + dx[i]
ny = y + dy[i]
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
x, y = nx, ny
print(x, y)
2차원 배열 90도 회전
n = len(a)
m = len(a[0])
result = [[0] * n for _ in range(m)]
after = []
for i in range(n):
tmp = []
for j in range(m):
tmp.append(before[m-1-j][i])
after.append(tmp)
for i in range(m):
tmp = []
for j in range(n):
tmp.append(before[j][m-1-i])
after.append(tmp)
#5 자료형
- 1e9, 1E9 는 10의 9제곱과 같다.
- 임의의 큰 수를 표현하기 위해 자주 표현되는 형식
if 0.3 + 0.6 == 0.9:
print(True)
else:
print(False)
- 튜플은 한 번 선언되면 변경할 수 없다.
- 튜플은 리스트에 비해 공간 효율적이다.
#6 내장함수 및 라이브러리
eval() : 문자열로 표현된 수식의 계산 결과값을 반환
result = eval("(3+5)*7")
순열과 조합
from itetools import permutations
data = [1, 4, 5, 6, 7]
result = list(permutations(data,3))
from itetools import combinations
data = [1, 4, 5, 6, 7]
result = list(combinations(data,3))
Counter : 원소의 등장 횟수를 간단히 셀 수 있다, 원소와 등장 횟수를 사전 형태로 저장할 수 있다.
from collections import Counter
counter = Counter(['red', 'blue', 'green'])
print(dict(counter))