본문 바로가기

카테고리 없음

코딩 테스트 합격자 되기 스터디 2주차 - 스택 / 큐

코딩테스트 합격자 되기 스터디 2주차

https://www.inflearn.com/course/cpp-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%95%A9%EA%B2%A9

스택

스택의 개념

  • LIFO(Last In First Out), 가장 최근에 들어간 원소가 가장 먼저 나오는 자료 구조)

스택을 활용할 수 있는 문제를 알아보는 법:

  1. 가장 최근에 들어온 원소를 알 수 있다.
  2. 가장 최근에 들어온 원소 순으로 나온다.

ADT란?

  • ADT(Abstract Data Type): 추상 데이터 타입의 약어
  • 세부 사항을 숨기고 사용자에게 필요한 기능만 명시
    • 세부 사항: 내부 자료구조, 프로그래밍 언어, 저장 공간의 크기
    • 사용자에게 필요한 기능: 연산, 입력, 출력
  • ADT를 사용하면?

복잡한 자료구조의 내부 구현을 감추고, 필요한 연산만 정의으로써 자료구조 동작 자체에 집중할 수 있음.

스택의 ADT

구분 정의 설명

연산 boolean ifFull() 스택에 들어 있는 데이터 개수가 maxsize인지 확인해 boolean 값을 반환. 가득 차 있다면 True, 아니면 False.
연산 boolean isEmpty() 스택에 들어 있는 데이터가 하나도 없는지 확인해 boolean값을 반환. 데이터가 하나라도 있으면 False, 아니면 True.
연산 void push(ItemType item) 스택에 데이터를 푸시합니다.
연산 ItemType pop() 스택에서 최근에 푸시한 데이터를 팝하고, 그 데이터를 반환합니다.
상태 Int top 스택에서 최근에 푸시한 데이터의 위치를 기록합니다.
상태 ItemType data(maxsize) 스택의 데이터를 관리하는 배열. 최대 maxsize개의 데이터 관리.

스택의 사용 예시

함수 호출

스택 동작 방식이 함수 호출 방식과 유사.

  • 함수 호출 시, 현재 함수의 실행상태를 저장, 새로운 함수로 제어 이동.

! 가장 최근이라는 키워드를 계속 기억하기

웹페이지

페이지 전환 시 스택에 push, 이전 페이지로 갈 때 pop.

괄호 짝 맞추기

{, (, }, )로 이뤄진 문자열이 주어질 때, 괄호의 짝이 맞는지 확인.

<aside> ⁉️ 물론 직관적으로 봐도 알 수 있지만, 직관을 좀 더 구체화 해보기.(괄호 짝이 맞다 틀리다 판단하는 과정 뜯어보기)

</aside>

열린 괄호는 자신과 가장 가까운 닫힌 괄호와 매칭

→ 열린 괄호 바로 다음 닫힌 괄호가 나오는 경우엔 구현도 큰 문제 없음.

→ 열열 닫닫 패턴은 그럼 어떻게 처리할 것인가? (O(N^2)인 경우 대부분 문제 TLE)

  • 닫힌 괄호 기준 가장 최근의 열린 괄호와 매칭되게 하면 O(N)에 가능

방법

  1. 여는 괄호는 push
  2. 닫힌 괄호가 나오면, pop 한 후에, 상쇄 여부 확인 맞는 괄호 아니면 exit 맞는 괄호면 계속 진행
  3. 문자열 끝까지 수행 후 스택에 남은게 없으면 success, 있으면 fail

큐의 개념

  • FIFO(First In First Out), 가장 먼저 들어간 원소가 가장 먼저 나오는 자료 구조.

큐의 ADT

구분 정의 설명

연산 boolean ifFull() 큐에 들어 있는 데이터 개수가 maxsize인지 확인해 boolean 값을 반환. 가득 차 있다면 True, 아니면 False.
연산 boolean isEmpty() 큐에 들어 있는 데이터가 하나도 없는지 확인해 boolean값을 반환. 데이터가 하나라도 있으면 False, 아니면 True.
연산 void push(ItemType item) 큐에 데이터를 푸시합니다.
연산 ItemType pop() 큐에서 처음에 푸시한 데이터를 팝하고, 그 데이터를 반환합니다.
상태 Int front 큐에서 가장 마지막에 팝한 위치 기록.
(가장 먼저 푸시된 원소의 위치)    
상태 Int rear 큐에서 최근에 푸시한 데이터의 위치 기록.
상태 ItemType data(maxsize) 큐의 데이터를 관리하는 배열. 최대 maxsize개의 데이터 관리.

큐의 사용 예시

줄 서기

요세푸스 문제

  1. N명의 사람들이 원형으로 둘러 앉고, 각 사람들 번호를 1~N으로 매김
  2. 시작 위치부터 K번째 사람 제거
  3. 제거한 위치부터 다시 K번째 사람 제거
  4. 3 과정을 한 명이 남을 때까지 반복

배열로 푼다면?

  1. 제거의 방향이 바뀜
  2. 제거 시 제거한 뒤의 원소가 모두 이동해야 함

시간 복잡도 O(N^2)

정리

  • 스택: LIFO, 함수 호출 관리, 페이지 탐색, 괄호 짝 맞추기
  • 큐: FIFO, 줄 서기, 요세푸스
  • 스택의 경우 “가장 최근 원소”를 봐야 하는 경우에 사용
    • 추후 DFS, 백트래킹에 사용
  • 큐는 들어온 순서대로 나갈 때 사용
    • 추후 BFS에서 사용