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

코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.

  • 1.
    코딩테스트 합격자 되기C++ 06/07장 스택/큐 저자 박경록
  • 2.
    목차 스택 - 스택의 개념 -스택의 ADT - 스택의 사용 예시 큐 -큐의 개념 - 큐의 ADT - 큐의 사용 예시
  • 3.
  • 4.
    스택의 개념 - LIFO(LastIn First Out), 가장 최근에 들어간 원소가 가장 먼저 나오는 자료구조
  • 5.
    ADT란? - ADT(Abstract DataType)는 추상 데이터 타입의 약어 - 세부 사항을 숨기고 사용자에게 필요한 기능만 명시 - 내부 자료구조 - 프로그래밍 언어 - 저장 공간의 크기 - 연산 - 입력 - 출력 전화번호부 put(name,phone) get(name) remove(name) contains(name) size() 연산 DataStorage data; int maxSize = 0; 상태 ADT를 사용하면, 복잡한 자료구조의 내부 구현을 감추고, 필요한 연산만 정 의함으로써 자료구조 동작 자체에 집중할 수 있음
  • 6.
  • 7.
    스택의 사용 예시(함수호출) - 함수 호출 시, 현재 함수의 실행상태(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
  • 12.
    큐의 개념 - FIFO(FirstIn First Out), 가장 먼저 들어간 원소가 가장 먼저 나오는 자료구조
  • 13.
  • 14.
  • 15.
    큐의 사용 예시(줄서기) 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. 과정을 한 명이 남을 때 까지 반복
  • 19.
    큐의 사용 예시(요세푸스문제, N = 5, K = 2)
  • 20.
    큐의 사용 예시(요세푸스문제 배열로 푼다면?) 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에서 사용
  • 24.
    커뮤니티 소개 - 오픈카톡방 - 깃허브 - 디스코드
  • 25.
    커뮤니티 소개(오픈카톡방) cont’d -저자 직접 운영 - 대략 400명 정도 인원이 자유롭게 소통 - 개인적인 주제 및 코딩 관련 소통 가능
  • 26.
  • 27.
    커뮤니티 소개(깃허브) cont’d -책 문제의 정답코드 - 코딩테스트 준비를 위해 필요한 자료구조 및 알고리즘 - C++ 기본 문법 - STL의 성능 비교
  • 28.
  • 29.
    커뮤니티 소개(디스코드) cont’d -모각코 진행 - 공식 스터디 / 개인 스터디 모집 공고 및 진행 - 책 관련 문의 / 답변
  • 30.