4. 자료구조(data structure)
2021 AL林 정기 세미나 4
효율적인 접근 및 수정을 가능하게 하는 자료의 집합
(In computer science, a data structure is a data organization,
management, and storage format that enables efficient access
and modification.)
효율적인 알고리즘을 설계하는데에 필요하다.
14. 스택
2020 AL林 정기 스터디 14
“Last In First Out”
마지막으로 들어간 데이터가
가장 먼저 나오는 자료구조
다음 연산을 O(1)에 수행
push(item): 스택의 가장 위에 원소 추가
pop(): 스택의 가장 위의 원소를 제거
top(): 스택의 가장 위에 있는 원소 확인
empty(): 스택이 비어있는지 확인
15. 큐
2020 AL林 정기 스터디 15
먼저 들어간 데이터가
가장 먼저 나오는 자료구조
다음 연산을 O(1)에 수행
push(item): 큐의 가장 뒤의 원소 추가
pop(): 큐의 가장 앞의 원소 삭제
front(): 큐의 가장 앞에 있는 원소 확인
back(): 큐의 가장 뒤에 있는 원소 확인
empty(): 큐가 비어있는지 확인
“First In First Out”
16. 덱
2020 AL林 정기 스터디 16
스택과 큐를 합친 구조
양쪽에서 push pop이 가능
push
push
pop
pop
17. 스택, 큐, 덱
2020 AL林 정기 스터디 17
push
pop
push pop
push
push
pop
pop
스택
큐
덱
18. 스택, 큐, 덱 - 구현하는 방법
2021 AL林 정기 세미나 18
• 정적 배열로 구현
• 동적 배열로 구현
• 연결 리스트로 구현
• 표준 라이브러리 사용
19. 스택, 큐, 덱 – 표준 라이브러리 사용
2020 AL林 정기 스터디 19
자료구조 C++ Java Python
스택 stack Stack 없음(동적 배열을 사용)
큐 queue LinkedList 없음(덱을 사용)
덱 deque ArrayDeque deque
20. 라이브러리를 씁시다!
2021 AL林 정기 세미나 20
실제로 스택, 큐, 덱을 구현할 일은 거의 없습니다.
다음을 연습합시다!
1. 각각의 자료구조의 성질 이해
2. 본인이 사용하는 언어에서 라이브러리를 쓰는 방법
3. 적절한 자료구조를 사용하여 문제를 해결하는 연습
21. 라이브러리를 쓰는 방법
2021 AL林 정기 세미나 21
다음 문제로 연습해봅시다.
스택 https://www.acmicpc.net/problem/10828
큐 https://www.acmicpc.net/problem/18258
덱 https://www.acmicpc.net/problem/10866
22. [BOJ 10828] 스택(Python)
2021 AL林 정기 세미나 22
from sys import stdin
input = stdin.readline
# python에서 스택은 list로 구현
stack = []
Q = int(input())
for _ in range(Q):
query = input().split()
# push X: 정수 X를 스택에 넣는 연산이다.
if query[0] == "push":
item = int(query[1])
stack.append(item)
# pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다.
# 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "pop":
if len(stack) == 0:
print(-1)
else:
print(stack.pop())
# size: 스택에 들어있는 정수의 개수를 출력한다.
if query[0] == "size":
print(len(stack))
# empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
if query[0] == "empty":
if len(stack) == 0:
print(1)
else:
print(0)
# top: 스택의 가장 위에 있는 정수를 출력한다.
# 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "top":
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
23. [BOJ 18258] 큐(Python)
2021 AL林 정기 세미나 23
# size: 큐에 들어있는 정수의 개수를 출력한다.
if query[0] == "size":
print(len(queue))
# empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
if query[0] == "empty":
if len(queue) == 0:
print(1)
else:
print(0)
# front: 큐의 가장 앞에 있는 정수를 출력한다.
# 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "front":
if len(queue) == 0:
print(-1)
else:
print(queue[0])
# back: 큐의 가장 뒤에 있는 정수를 출력한다.
# 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "back":
if len(queue) == 0:
print(-1)
else:
print(queue[-1])
from collections import deque
from sys import stdin
input = stdin.readline
# python에서 큐는 collections.deque로 구현
queue = deque([])
Q = int(input())
for _ in range(Q):
query = input().split()
# push X: 정수 X를 큐에 넣는 연산이다.
if query[0] == "push":
item = int(query[1])
queue.append(item)
# pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다.
# 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "pop":
if len(queue) == 0:
print(-1)
else:
print(queue.popleft())
24. [BOJ 10866] 덱(Python)
2021 AL林 정기 세미나 24
from collections import deque
from sys import stdin
input = stdin.readline
# python에서 덱은 collections.deque로 구현
dq = deque([])
Q = int(input())
for _ in range(Q):
query = input().split()
# push_front X: 정수 X를 덱의 앞에 넣는다.
if query[0] == "push_front":
item = int(query[1])
dq.appendleft(item)
# push_back X: 정수 X를 덱의 뒤에 넣는다.
if query[0] == "push_back":
item = int(query[1])
dq.append(item)
# pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다.
# 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "pop_front":
if len(dq) == 0:
print(-1)
else:
print(dq.popleft())
# pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다.
# 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "pop_back":
if len(dq) == 0:
print(-1)
else:
print(dq.pop())
# size: 덱에 들어있는 정수의 개수를 출력한다.
if query[0] == "size":
print(len(dq))
# empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
if query[0] == "empty":
if len(dq) == 0:
print(1)
else:
print(0)
25. [BOJ 10866] 덱(Python)
2021 AL林 정기 세미나 25
# front: 덱의 가장 앞에 있는 정수를 출력한다.
# 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "front":
if len(dq) == 0:
print(-1)
else:
print(dq[0])
# back: 덱의 가장 뒤에 있는 정수를 출력한다.
# 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
if query[0] == "back":
if len(dq) == 0:
print(-1)
else:
print(dq[-1])
28. [BOJ 9012] 괄호
2021 AL林 정기 세미나 28
단순히 괄호의 갯수만 세서 풀면 안됩니다. ex) “ ) ( ”
① NO인 경우
1. ( ( ) ) ( ) ) -> 닫는 괄호에 대해 여는 괄호가 없을 때
2. ( ( ( ( ) ( ) ) ( ) -> 여는 괄호에 대해 닫는 괄호가 없을 때
29. [BOJ 9012] 괄호
2021 AL林 정기 세미나 29
② 괄호 쌍을 맞추는 방법
1. stack에 여는 괄호를 쌓으면서(push)
2. 닫는 괄호를 만나면 stack에 쌓아놓은 여는 괄호와 매칭합니다.(pop)
따라서
stack으로 괄호 쌍을 맞추면서
NO인 경우를 판별하면 됩니다.
30. [BOJ 9012] 괄호 - 소스코드
2021 AL林 정기 세미나 30
Q = int(input())
for _ in range(Q):
str = input()
stack = []
answer = 'YES'
# '(' -> push
# ')' -> pop
for c in str:
if c == '(':
stack.append('(')
elif c == ')':
# 1. 닫는 괄호에 대해 여는 괄호가 없을 때 NO
if len(stack) == 0:
answer = 'NO'
else:
stack.pop()
# 2. 여는 괄호에 대해 닫는 괄호가 없을 때 NO
if len(stack) > 0:
answer = 'NO'
print(answer)
32. [BOJ 2164] 카드2
2021 AL林 정기 세미나 32
그대로 시뮬레이션을 하면 됩니다.
while(카드가 한 장이 아닐 때) {
1. 제일 위에 있는 카드를 버린다.
2. 제일 위에 있는 카드를 제일 아래에 옮긴다.
}
1과 2를 효율적으로 수행할 수 있는 자료구조 : 큐
33. [BOJ 2164] 카드2 - 소스코드
2021 AL林 정기 세미나 33
from collections import deque
N = int(input())
cards = [i for i in range(1, N + 1)]
queue = deque(cards)
while len(queue) > 1:
# 1. 제일 위에 있는 카드를 버린다.
queue.popleft()
# 2. 제일 위에 있는 카드를 제일 아래에 옮긴다.
x = queue.popleft()
queue.append(x)
print(queue[0])
34. (참고) 없어도 풀리는데요?
2021 AL林 정기 세미나 34
[BOJ 9012 괄호]는 스택이 없어도 풀립니다.
-> 괄호의 종류가 한 종류이기 때문입니다.
-> 괄호의 종류가 여러개로 늘어나면 스택을 써야합니다.
-> 연습문제: 괄호의 값
[BOJ 2164 카드2]는 큐가 없어도 풀립니다.
-> 규칙성을 잘 찾으면 식 하나로 O(1)에 풀립니다.
-> 이건 오늘 주제와 무관하니 넘어갑시다.
35. 연습문제
2021 AL林 정기 세미나 35
스택, 큐, 덱
기본 문제
10828 스택
18258 큐 2
10866 덱
연습 문제
(문제풀이 스터디 발표)
2504 괄호의 값
1935 후위 표기식2
11866 요세푸스 문제 0
1966 프린터 큐
1021 회전하는 큐
36. 연습문제
2021 AL林 정기 세미나 36
스택, 큐, 덱
도전 문제
1918 후위표기식
5430 AC
3078 좋은 친구
17298 오큰수
3015 오아시스 재결합
38. 스택, 큐의 응용
2021 AL林 정기 세미나 38
스택과 큐는 컴퓨터과학에서 정말 자주 나옵니다.
• 메모리 관리(Memory management)
• 재귀함수는 스택 메모리를 사용합니다.
• CPU 스케쥴링(CPU task scheduling)
• 인터럽트 핸들링(Handling of interrupt)
• 네트워크 스케쥴링(Network scheduling) 출처: https://dojang.io/mod/page/view.php?id=584
39. 스택, 큐의 응용
2021 AL林 정기 세미나 39
다양한 알고리즘을 구현하는 데에도 필요합니다.
- 그래프 탐색(BFS, DFS)
- 사이클 찾기, 위상정렬, SCC
- 그라함 스캔 등등
40. 직접 구현하기
2021 AL林 정기 세미나 40
보통 학교에서 자료구조 수업을 들으면 이 중 일부를 구현해봅니다.
자료구조 책을 참고하는게 좋을 것 같습니다. 아래는 제가 구글링 해봤습니다
동적 배열
C언어로 구현 : 링크
★ 연결 리스트
C언어로 구현 : 링크
python으로 구현 : 링크
41. 직접 구현하기
2021 AL林 정기 세미나 41
스택
- 정적 배열로 구현: C언어
- 동적 배열로 구현: 동적 배열을 그대로 사용하면 됩니다.
- 연결 리스트로 구현: Python, C언어
큐
- 정적 배열로 구현: C언어, C언어
- 연결 리스트로 구현: Python, C언어
덱
- 정적 배열로 구현: C언어
- 연결 리스트로 구현: Python, C언어
42. 그 외 참고할만한 자료
2021 AL林 정기 세미나 42
kks님 블로그
• https://m.blog.naver.com/kks227/220781402507
• https://m.blog.naver.com/kks227/220781557098
• https://m.blog.naver.com/kks227/220781851401
바킹독님 블로그
• https://blog.encrypted.gg/927?category=773649
• https://blog.encrypted.gg/932?category=773649
• https://blog.encrypted.gg/933?category=773649
• https://blog.encrypted.gg/934?category=773649
• https://blog.encrypted.gg/935?category=773649
• https://blog.encrypted.gg/936?category=773649 (수식의 괄호 쌍)