스택 / 큐 개념에 공부한걸 적어두자!

임동현·2022년 10월 11일
0
post-thumbnail

스택

스택- 개념
데이터의 추상적 형태와 그 데이터를 다루는 방법만을 정해놓은 것을 가지고 ADT(abstract Data Type) 혹은 추상 자료형이라고합니다.

  1. 데이터를 집어넣을 수 있는 선형(linear) 자료형입니다.

  2. 나중에 집어넣은 데이터가 먼저 나옵니다. 이 특징을 줄여서 LIFO(Last In First Out) 라고 부릅니다.

  3. 데이터를 집어넣은 push , 데이터를 추출하는 pop, 맨 나중에 집어넣은 데이터를 확인하는 peek 등의 작업을 할 수 있습니다.

push 는 스택에 데이터를 삽입하는 기능
pop 은 스택에서 데이트를 꺼내는 기능
peek 은 스택에서 데이터를 꺼내지 않고 Top head 에 있는 데이터를 꺼내는 기능
isEmpty 스택이 비었는지 체크하는 기능

간단한 프로그래머스 클래스 수업중 예시 문제인데 스택에 대한 이해와 for ... of 반복문을
통해서 풀이하는방법을 알게되었다 .

// 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

// "()()" 또는 "(())()" 는 올바른 괄호입니다.
// ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

// '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

// 제한사항
// 문자열 s의 길이 : 100,000 이하의 자연수
// 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

// 입출력 예
// s	answer
// "()()"	true
// "(())()"	true
// ")()("	false
// "(()("	false
// 입출력 예 설명
// 입출력 예 #1,2,3,4
// 문제의 예시와 같습니다.

// 스택을 이용해서 풀이해보면 스택이 빈배열이면 true 아니면 false 라고 생각을 해보고 풀이

// for (const c of s) => for .. of 반복문을 통한 풀이
// for .. of 반복문은 일반적으로 배열에 많이 사용되는데 , 배열의 요소 개수 만큼 반복하고 , 반복 때 마다 각 요소들을 사용할 수 있는 변수가
// 주어지는 독특한 반복문이라고 할 수 있다.
// // {
//         #### 문법
//         for( 변수 of 배열){
//             반복문 동작 부분
//         }
// }

function solution(s) {
    const stack = [];
    for (const c of s) {
        if (c === "(") {
            stack.push(c);
        } else {
            if (stack.length === 0) {
                return false;
            }
            stack.pop();
        }
    }
    return stack.length === 0;
}

큐 - 개념
First In First Out (FIFO) 먼저 들어간 데이터가 먼저 나오는 규칙이다.
먼저 들어간게 나중에 나오는 스택과의 반대의 특성을 가지고있다.

큐는 운영체제에서도 쓰입니다. 운영체제가 프로세스의 작업 요청을 들어온 순서대로 큐에 넣고
CPU 가 순서대로 꺼내서 처리합니다. 이를 운영체제에서는 FIFO 스케쥴링이라고 합니다.

큐는 일상생활에서 질서있는 줄을 큐라고 생각하면 쉽다.

스택 - 구현
enqueue - 데이터 삽입
스택의 push 라고 볼수 있다.

dequeue - 데이터 제거
dequeue 는 큐에 있는 데이터를 제거하는 기능입니다. 스택의 pop 이라고 볼수있습니다.
front - 데이터 참조
front 는 가장 먼저 들어간 데이터 , 즉 tail 이 가리키고 있는 데이터를 제거하지는 않고 참조만 하는 기능입니다.

스택의 peek 으로만 볼수 있습니다.

isEmpty - 비었는지 확인
isEmpty 는 큐가 비었는지 확인하는 기능

// 프린터

// 문제 설명

// 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다.
// 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

// 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. * 중요한 문구  가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
// 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.  *  대기목록의 가장 마지막에 넣습니다.
// 3. 그렇지 않으면 J를 인쇄합니다.

// 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

// 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.
// *  내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다.

// 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때,
//  내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

// 제한사항
// 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
// 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
// location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

// 입출력 예
// priorities	    location	return
// [2, 1, 3, 2]	        2	       1
// [1, 1, 9, 1, 1, 1]	0	       5

// 입출력 예 설명
// 예제 #1

// 문제에 나온 예와 같습니다.

// 예제 #2

// 6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.

큐로도 구현이 가능하지만 배열을 통해서 풀이


Array

class Queue {
    constructor(){
        this.queue = []
        this.front = 0
        this.rear = 0
    }

    enqueue(value){
        this.queue[this.rear ++] = value
    }

    dequeue(){
        const value = this.queue[this.front]
        delete this.queue[this.front]
        this.front += 1
        return value
    }

    peek(){
        return this.queue[this.front]
    }
}

function solution(priorities, location) {
    const queue = new Queue()

    for(let i = 0; i < priorities.length; i ++){
        queue.enqueue([priorities[i], i])
    }

    priorities.sort((a,b) => b-a)
    let count = 0
    while(true){
        let currentValue = queue.peek()
        if(currentValue[0] < priorities[count]){
            queue.enqueue(queue.dequeue())
        } else {
            const value = queue.dequeue()
            count += 1
            if(location === value[1]){
                return count
            }
        }
    }
   return count
}
profile
프론트엔드 공부중

1개의 댓글

comment-user-thumbnail
2022년 11월 2일

글 잘보고 갑니다~!

답글 달기