https://github.com/WeareSoft/tech-interview/blob/master/contents/datastructure.md 의 내용을 기반으로 작성하였습니다.
스택이란 한쪽 끝에서만 자료를 넣고 뺄 수 있는 선형구조(LIFO 특징)로 된 자료구조입니다.
장점
단점 (일반적인 스택 구현시)
LIFO(LAST IN FIRST OUT)한 특징을 가지는 스택의 연산은 다음과 같습니다.
재귀알고리즘에 유용
- 재귀적으로 함수를 호출해야 하는 경우에 임시 데이터를 스택에 넣어준다.
- 재귀함수를 빠져 나와 퇴각 검색(backtrack)을 할 때는 스택에 넣어 두었던 임시 데이터를 빼 줘야 한다.
- 스택은 이런 일련의 행위를 직관적으로 가능하게 해 준다.
- 또한 스택은 재귀 알고리즘을 반복적 형태(iterative)를 통해서 구현할 수 있게 해준다.
웹 브라우저 방문기록
실행 취소 (undo)
역순 문자열 만들기
수식의 괄호 검사
후위 표기법 계산
list
타입을 이용하여 스택사용하기stack = []
stack.push(4) # [4]
stack.push(6) # [4,6]
stack.push(7) # [4,6,7]
print(stack[-1]) # 7
print(stack.pop()) #7 [4,6]
deque
라이브러리 를 이용하여 스택사용하기 (큐를 만들때도 활용이 가능하다)아래의 Dequeue에서 자세히 설명하겠다.
컴퓨터의 기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식이다.
FIFO(First-In-First-Out)의 규칙을 따르는 큐의 연산은 다음과 같이 대표됩니다.
데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.
1. Linear Queue (선형큐)
2. Circular Queue (원형큐)
원형큐/ 환형큐
선형 큐의 문제점(배열로 큐를 선언할시 큐의 삭제와 생성이 계속 일어났을때, 마지막 배열에 도달후 실제로는 데이터공간이 남아있지만 오버플로우가 발생)을 보완한 것
front가 큐의 끝에 닿으면 큐의 맨 앞으로 자료를 보내어 원형으로 연결 하는 방식이다.
다음은 원형 큐의 작동 방식이다.
DATA : A B C D E
3. Linked List Queue (연결리스트를 이용해 구현한 큐)
queue
라이브러리를 이용하여 큐 만들어쓰기from queueimport Queue
q = queue() # 빈큐 생성
q.put(1) # add(원소)
q.put(2)
q.put(3)
q.put(4)
q.get() # 4
deque
라이브러리 를 이용하여 큐사용하기 스택과 큐를 합친 자료구조로 앞뒤에 원소를 넣고 뺄 수 있다.
from collections import deque
dq=deque()
dq.append() # push
dq.pop() # pop 5
dq.popleft() # 가장 왼쪽 원소 반환
dq.appendleft() # 덱의 가장 왼쪽에 원소 삽입
dp.pop() # 가장 오른쪽 원소 반환
dp.clear() # 모든 원소 제거
dp.copy() # 덱 복사
dp.count(x) #x와 같은 원소의 개수를 계산
deque(iterable, [, maxlen]) : 초기화 함수로, iterable(리스트 등)을 인자로 건내면 이를 deque화 시켜준다.
from collections import deque
dq1 = deque() #빈큐
dq2 = deque([1, 2, 3, 4, 5])
# 큐 최대 길이 명시하기(원소를 이보다 많이 넣으면 maxlen이 자동 갱신됨)
dq3 = deque(maxlen=5)
그래프는 노드(N, node)와 그 노드들을 연결하는 엣지(E, edge)를 포함하는 비선형 자료구조입니다. 즉, 연결되어있는 객체 관의 관계를 표현할 수 있습니다.
A Graph consists of a finite set of vertices(or nodes) and set of Edges which connect a pair of nodes. - geeksforgeeks
그래프의 종류는 크게 세가지로 나뉜다.
1. 무방향 그래프(Undirected Graph)
2. 방향그래프 (Directed Graph)
3. 가중치 그래프 (Wighted Graph)
그래프는 연결여부에 따라 두가지로 나뉠 수 있다.
사이클이란 단순 경로(경로중에서 반복되는 정점이 없는 경우)의 시작 점정과 종료정점이 동일한 경우이다.
아래의 간단한 예제를 통해 사이클에 대해 자세히 이해해보겠다.
우선 무방향그래프의 경우이다.
- 다음의 "무방향그래프"가 존재할때, 사이클이 존재하나요?
Input: n = 4, e = 4 0 1, 1 2, 2 3, 0 2
"YES" : 사이클은 0-2-1-0에서 존재한다.
- 다음의 "무방향그래프"가 존재할때, 사이클이 존재하나요?
Input:n = 4, e = 3 0 1, 1 2, 2 3
"NO" : 시작정점과 종료정점이 동일한 경우는 존재하지 않는다.
다음은 방향그래프의 경우이다.
방향그래프에서는 화살표를 따라가다보면 사이클이 존재하는지 쉽게 확인가능하다.
- 다음의 "방향그래프"가 존재할때, 사이클이 존재하나요?
Input: n = 4, e = 6 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
"YES" : 0 - 2 - 0 에서 사이클이 보여진다. 2에서 0으로 연결되서 사이클이 발생한다.
- 다음의 "방향그래프"가 존재할때, 사이클이 존재하나요?
Input:n = 4, e = 4 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 3
"NO"
그래프를 탐색하는 방법은 일반적으로 2가지로 이야기한다. 하지만 해당 부분은 나중에 자세히 설명하도록하겠다.
DFS (Depth-First-Search) : 깊이우선탐색
루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
BFS (Breadth-First-Search) : 너비우선탐색
루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법
다음의 사이트들을 이용하며 더욱 자료구조를 이해하기 쉬울 것이다.
https://visualgo.net/en/list
https://www.cs.usfca.edu/~galles/visualization/StackLL.html
https://ooeunz.tistory.com/31
https://ko.wikipedia.org/wiki/%ED%81%90_(%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0)
https://docs.python.org/3.8/library/collections.html#collections.deque
https://velog.io/@yeseolee/Python-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack
https://www.geeksforgeeks.org/graph-data-structure-and-algorithms/
https://visualgo.net/en/list
https://www.cs.usfca.edu/~galles/visualization/StackLL.html
https://pangtrue.tistory.com/147
https://gmlwjd9405.github.io/2018/08/13/data-structure-graph.html
https://velog.io/@inyong_pang/%ED%81%90Queue#4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%97%B0%EC%8A%B5