Stack, Queue, Deque는 말 그대로 기본 자료구조인만큼 리뷰할만한 내용이 거의 없다. 아래의 두 가지 내용만 잘 알아두고 있어도 충분한 것 같다.
① Deque의 import 문
from collections import deque
② Deque의 길이
deq = deque()
len(deq) # 기존 리스트의 길이와 동일
① 코드
def binary_search(lst, target):
start = 0
end = len(lst) - 1
while start <= end:
mid = (start + end) // 2 # 소수점 이하 버림
if lst[mid] == target:
return mid
elif lst[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
② 주의 사항
lst[mid] == target
이 아닌, mid == target
과 같이 쓰지 않도록 주의한다.① BFS/DFS를 수행하기 위해 저장해야 하는 정보
② BFS와 DFS 구현 코드
def BFS(V):
deq = deque()
deq.append(V)
visited1[V] = 1 # append 시점 직후에 visited 배열 업데이트
while deq:
V = deq.popleft()
for i in tree[V]: # 인접 노드 중
if visited1[i] == 0: # 방문하지 않은 노드
deq.append(i)
visited1[i] = 1 # append 시점 직후에 visited 배열 업데이트
def DFS(V):
visited2[V] = 1 # 재귀 호출 된 직후에 visited 배열 업데이트
for i in tree[V]: # 인접 노드 중
if visited2[i] == 0: # 방문하지 않은 노드
dfs(i)
③ 방문할 수 있는 정점이 여러 개일 때, 정점 번호가 작은 것을 먼저 방문해야 하는 조건이 있는 경우
# 정점 번호가 1부터 시작한다고 가정
tree = [[] for i in range(N + 1)]
for i in range(E): # 간선 개수만큼 반복
u, v = map(int, input().split()) # 연결된 두 정점
tree[u].append(v) # 양방향 간선
tree[v].append(u)
for i in range(1, N + 1): # 각 노드의 인접 노드를 오름차순으로 정렬
tree[i].sort()
④ DFS에서 현재 노드의 깊이를 알아야 하는 경우
def DFS(V, depth):
visited[V] = 1 # 재귀 호출 된 직후에 visited 배열 업데이트
print(depth)
for i in tree[V]: # 인접 노드 중
if visited[i] == 0: # 방문하지 않은 노드
dfs(i, depth + 1)
① 딕셔너리를 이용한 트리 표현
② 재귀 호출을 이용한 구현
정렬 알고리즘 자체를 구현하는 문제는 나오지 않기 때문에, 편하게 읽고 넘어갈 수 있을만한 부분이다. 아래의 내용만 간단히 확인해도 충분할 것 같다.
① Bubble Sort
② Counting Sort
① 최적해 보장 조건
② 우선순위 큐
from queue import PriorityQueue
put((우선순위, 아이템))
과 같이 튜플을 전달해야 한다. put(우선순위, 아이템)
의 형태로 사용하지 않도록 주의한다.pq = PriorityQueue()
pq.put([1, 'apple'])
pq.put([2, 'banana'])
print(pq.queue[0]) # [1, 'apple'] 출력
fruit = pq.get()
name = fruit[1] # 인덱싱 연산을 통해 과일의 이름을 가져온다.
print(name) # apple 출력
① 아이디어
② 배열 초기화
## 잘못된 초기화 ##
lst = []
for i in range(N + 1):
lst.append(i) # 1번 인덱스의 원소가 1이 되어 마지막에 함께 출력됨
## 올바른 초기화 ##
lst = [0] * (N + 1) # 0번 인덱스와 1번 인덱스의 원소를 0으로 초기화
for i in range(2, N + 1):
lst[i] = i
③ 배수 제거 코드
for i in range(2, int(N ** 0.5) + 1):
if lst[i] == 0:
continue
for j in range(i + i, N + 1, i):
lst[j] = 0
④ 소수 판별 코드
def isPrime(N):
if N == 1:
return False
for i in range(2, int(N ** 0.5) + 1):
if N % i == 0:
return False
return True
⑤ 권장 사항
① 아이디어
P[N] // K
로 구할 수 있다.P[N] // N'
으로 구할 수 있다.② 특정 N과 서로소인, N 이하의 자연수의 개수를 구하는 문제
result = N # P[N]의 값
for K in range(2, int(N ** 0.5) + 1):
# 단순히 K가 N의 약수인지를 검사하는 식이지만, 소인수 분해의 원리에 의해 K는 항상 소수가 됨.
if N % K == 0:
result -= result // K # N에서 K의 배수의 개수만큼 뺌.
while N % K == 0: # N 값 갱신
N //= K
if N > 1: # 갱신된 N이 소수
result -= result // N # N이 소수이므로, 위 식에 K 대신 N을 대입