탐색이란
많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미
프로그래밍에서는 그래프, 트리 등의 자료구조 안에서 탐색을 하는 문제를 자주 다룬다.
대표적인 탐색 알고리즘으로 DFS와 BFS를 꼽을 수 있는데 이 두 알고리즘의 원리를 제대로 이해해야 코딩 테스트의 탐색 문제 유형을 풀 수 있다.
그런데 DFS, BFS를 제대로 이해하려면 기본 자료구조인 스택과 큐에 대한 이해가 전제되어야 하므로 사전 학습으로 스택과 큐를 간단히 정리해보자.
자료구조란
데이터를 표현하고 관리하고 처리하기 위한 구조
스택과 큐는 자료구조의 기초 개념으로 다음의 두 핵심적인 함수로 구성
- 삽입(Push) : 데이터를 삽입
- 삭제(Pop) : 데이터를 삭제
스택
스택은 박스 쌓기에 비유할 수 있다.
흔히 박스는 아래에서부터 위로 차곡차곡 쌓는다.
그리고 아래에 있는 박스를 치우기 위해서는 위에 있는 박스를 먼저 내려야 한다.
이러한 구조를 선입후출(Frist In Last Out) 구조 또는 후입선출(Last In First Out)구조라고 한다.
파이썬에서 스택을 이용할 때는 별도의 라이브러리를 사용할 필요가 없다. 기본 리스트에서 append() 와 pop() 메서드를 이용하면 스택 자료구조와 동일하게 동작한다.
append() 메서드는 리스트의 가장 뒤쪽에 데이터를 삽입하고
pop() 메서드는 리스트의 가장 뒤쪽에서 데이터를 꺼내기 때문이다.
그럼, 스택에서 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제() 순서대로 파이썬 코드로 표현해보겠다.
# 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
stack = []
stack.append(5) # 5
stack.append(2) # 5 - 2
stack.append(3) # 5 - 2 - 3
stack.append(7) # 5 - 2 - 3 - 7
stack.pop() # 5 - 2 - 3
stack.append(1) # 5 - 2 - 3 - 1
stack.append(4) # 5 - 2 - 3 - 1 - 4
stack.pop() # 5 - 2 - 3 - 1
print(stack)
# [5, 2, 3, 1] # 최하단 원소부터 출력
print(stack[::-1]) # 최상단 원소부터 출력
# [1, 3, 2, 5]
큐
대기 줄에 비유할 수 있다.
놀이공원에 입장하기 위해 줄을 설 때, 먼저 온 사람이 먼저 들어가게 된다.
나중에 온 사람일수록 나중에 들어가기 때문에 흔히 '공정한' 자료구조라고 비유된다.
이러한 구조를 선입선출(First In First Out) 구조라고 한다.
파이썬에서 큐를 이용할 때는 collections 모듈에서 제공하는 deque 자료구조를 활용한다.
deque 는 스택과 큐의 장점을 모두 채택한 것인데 데이터를 넣고 빼는 속도가 리스트 자료형에 비해 효율적이며 queue 라이브러리를 이용하는 것보다 더 간단하다.
대부분의 코딩 테스트에서 collections 모듈과 같은 기본 라이브러리 사용을 허용하므로 안심하고 사용하면 된다.
그럼, 큐에서 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제() 순서대로 파이썬 코드로 표현해보겠다.
# 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
from collections import deque
queue = deque()
queue.append(5) # 5
queue.append(2) # 5 - 2
queue.append(3) # 5 - 2 - 3
queue.append(7) # 5 - 2 - 3 - 7
queue.pop() # 2 - 3 - 7
queue.append(1) # 2 - 3 - 7 - 1
queue.append(4) # 2 - 3 - 7 - 1 - 4
queue.pop() # 3 - 7 - 1 - 4
print(queue) # 먼저 들어온 순서대로 출력
# deque[3, 7, 1, 4]
queue.reverse()
print(list(queue)) # 나중에 들어온 원소부터 출력
# [4, 1, 7, 3]
물론 실제로 스택과 큐를 사용할 때는 삽입과 삭제 외에도 오버플로와 언더플로를 고민해야 한다.
오버플로(Overflow)
특정한 자료구조가 수용할 수 있는 데이터의 크기를 이미 가득 찬 상태에서 삽입 연산을 수행할 때 발생
즉, 저장 공간을 벗어나 데이터가 넘쳐흐를 때 발생
언더플로 (Underflow)
특정한 자료구조에 데이터가 전혀 들어 있지 않는 상태에서 삭제 연산을 수행할 때 발생
즉, 데이터가 전혀 없는 상태일 때 연산 수행 시 발생
'알고리즘 > DFS,BFS' 카테고리의 다른 글
[백준], 1260번, DFS와 BFS (파이썬) (0) | 2021.05.06 |
---|---|
미로 탈출 (0) | 2021.05.06 |
음료수 얼려 먹기 (0) | 2021.05.06 |
탐색 알고리즘 DFS, BFS (0) | 2021.05.06 |
재귀 함수 Recursive Fuction (0) | 2021.05.04 |