ADT란?
- ADT(Abstract DataType)는 추상 데이터 타입의 약어
- 세부 사항을 숨기고 사용자에게 필요한 기능만 명시
- 내부 자료구조
- 프로그래밍 언어
- 저장 공간의 크기
- 연산
- 입력
- 출력
전화번호부
put(name,phone)
get(name)
remove(name)
contains(name)
size()
연산
DataStorage data;
int maxSize = 0;
상태
ADT를 사용하면,
복잡한 자료구조의 내부 구현을 감추고, 필요한 연산만 정
의함으로써 자료구조 동작 자체에 집중할 수 있음
스택의 사용 예시(함수호출)
- 함수 호출 시, 현재 함수의 실행상태(context)를 저장, 새로운 함수로 제어 이동
①
②
③
④
⑤
main() main()
A()
main()
A()
B()
main()
A()
B()
main()
A()
main()
① ② ③ ④ ⑤ 끝
8.
스택의 사용 예시(이전페이지로 가기)
페이지를 전환할때마다 스택에 푸시, 이전페이지로 갈때 팝
페이지 A 페이지 B 페이지 C 뒤로가기 뒤로가기
A A
B
A
B
C
A
B
C
A
B
9.
스택의 사용예시(괄호 짝맞추기)
{,(,},) 로 이뤄진 문자열이 주어질 때, 괄호의 짝이 맞는지 확인
{ } ( { } ) { { ( { } ) { } ( { ) )
짝이 맞음 짝이 맞지 않음 짝이 맞지 않음
물론 직관적으로 봐도 알 수 있다.
하지만 직관을 좀 더 구체화 해보자. 우리가 괄호 짝이 맞다 틀리다 판단하는 과정이 무엇인가?
10.
스택의 사용예시(괄호 짝맞추기)
{,(,},) 로 이뤄진 문자열이 주어질 때, 괄호의 짝이 맞는지 확인
{ } ( { } ) { { ( { } ) { } ( { ) )
① ②
③
①
②
① ②
* 열린 괄호는 자신과 가장 가까운 닫힌 괄호와 매칭 된다.
=> 열린괄호 바로 다음 닫힌괄호가 나오는 경우엔 구현도 큰 문제 없음 (그림#1-①)
=> 열열닫닫 패턴은 어떻게 처리할 것인가?(그림#1-①,②, O(N^2)인 경우 대부분 문제 TLE)
* 닫힌 괄호 기준 가장 최근의 열린 괄호와 매칭되게 하면 O(N)에 가능
11.
스택의 사용예시(괄호 짝맞추기)
{,(,},) 로 이뤄진 문자열이 주어질 때, 괄호의 짝이 맞는지 확인
{ } ( { } )
① ②
③
{ {
}
{
(
( {
(
{
}
(
{
)
(
[반복 시작]
1. 여는 괄호는 푸시
2. 닫힌 괄호가 나오면, 팝 한후에, 상쇄여부 확인
2-1) 맞는 괄호가 아니면 exit.
2-2) 맞는 괄호이면 계속 진행
[반복 끝]
3. 문자열 끝까지 수행 후 스택에 남아있는게 없
으면 success, 있으면 fail
큐의 사용 예시(줄서기)
A
A
B
A
B
C
front
B
A
A
rear
B
C
D
E
C
D
한 명씩 줄을 서는 모습 입니다.
rear는 가장 최근에 들어온 원소의 위치이고,
front는 가장 먼저 들어온 원소의 위치 입니다.
16.
큐의 사용 예시(줄서기)
A
B
C
D
E
B
C
D
E
C
D
E
front
E
E
D
rear
pop()을 하면 front 위치에 있는 원소가 큐에서
삭제 됩니다.
대기자가 한 명씩 영화관에 들어가는 모습
front 위치의 원소들이 나가는걸 볼수 있습니다.
front는 계속해서 남아 있는 원소중 가장 먼저
삽입한 원소의 위치를 가르 킵니다.
17.
큐의 사용 예시(줄서기)
A
A
B
A
B
C
front
B
A
A
rear
B
C
D
E
C
D
한 명씩 줄을 서는 모습 입니다.
rear는 가장 최근에 들어온 원소의 위치이고,
front는 가장 먼저 들어온 원소의 위치 입니다.
18.
큐의 사용 예시(요세푸스문제)
1. N 명의 사람들이 원형을로 둘러앉고, 각 사람들 번호를 1~ N로 매김
2. 시작 위치부터 K번째 사람 제거
3. 제거한 위치부터 다시 K번째 사람 제거
4. 3. 과정을 한 명이 남을 때 까지 반복
큐의 사용 예시(요세푸스문제 배열로 푼다면?)
1 2 3 4 5
① 제거
③ 이동
1 3 4 5
②이동 ③이동
① 제거
②이동
1 3 5
① 제거
③ 이동
②이동
3 5
① 제거
3
배열로 풀때 문제점
1. 제거의 방향의 바뀜
2. 제거시 제거한 뒤의
원소가 모두 이동해야함
시간 복잡도 O(N^2)
21.
큐의 사용 예시(요세푸스문제 배열로 푼다면?)
5 4 3 2 1
팝
1 5 4 3 2
1 5 4 3 1 5 4
팝
3
3 1 5 5 3 1
팝
팝&푸시
팝&푸시
팝&푸시
22.
큐의 사용 예시(요세푸스문제 배열로 푼다면?)
5 3 3 5
팝
3
팝(마지막 원소)
큐로 풀면
1. 제거 동작이 푸시/팝으로 구현되므로 방향고려 X
2. 제거 후에도 이후 원소 이동 필요 없음
시간 복잡도 O(N*K)
23.
정리
- 스택 :LIFO, 함수 호출 관리 , 페이지 탐색, 괄호 짝 맞추기
- 큐 : FIFO, 줄 서기, 요세푸스
- 스택의 경우 “가장 최근 원소”를 봐야하는 경우에 사용
* 추후 DFS, 백트래킹에서 사용
- 큐는 들어온 순서대로 나갈 때 사용
* 추후 BFS에서 사용