๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ž๋ฃŒ๊ตฌ์กฐ ์ด๋ก 

Stack - (์„ ํ˜•)์ž๋ฃŒ๊ตฌ์กฐ

by sh119 2024. 6. 18.

 


stack์€ ํ›„์ž…์„ ์ถœ (LIFO)์ด๋ž€ ํŠน์„ฑ์„ ๊ฐ€์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ฃผ๋กœ ํ•จ์ˆ˜์ฝœ ์Šคํƒ, ์ˆ˜์‹ ๊ณ„์‚ฐ, ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค. 

์Šคํƒ์€ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ์ƒํ™ฉ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ *๊ฒ€์ƒ‰์ด๋‚˜ ์ •๋ ฌ์€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ์ข‹์ง€ ์•Š์•„ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

 

stack์€ push๋ฅผ ํ†ตํ•ด ์ž…๋ ฅํ•˜๊ณ  pop์„ ํ†ตํ•ด ์ถœ๋ ฅํ•œ๋‹ค. ๋˜ํ•œ ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด๊ฐ„ ๊ฐ’์„ bottom์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„ ๊ฐ’์„ top์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 

 

Stack์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

  1. ์‚ฝ์ž…/ ์‚ญ์ œ : O(1)
  2. ๊ฒ€์ƒ‰ : O(n) (๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ™•์ธํ•ด์•ผํ•œ๋‹ค)
  3. ์ •๋ ฌ : O(nlogn)

 

Java ์—์„œ์˜ ์‚ฌ์šฉ๋ฒ• 

* JAVA์—์„œ๋Š” stack์„ import ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ java์—์„œ์˜ stack ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Stack stack = new Stack();

stack.push(1); // stack์— 1์ด๋ž€ ๊ฐ’ ์ง‘์–ด ๋„ฃ๊ธฐ

stack.pop(); // top์„ ์ถœ๋ ฅ ํ›„ ๋น„์›€

stack.peek(); // top ์„ return (๋น„์šฐ์ง€ ์•Š๊ณ  ์ถœ๋ ฅ๋งŒ)

stack.contains(1); // 1์„ ํฌํ•จํ•˜๋Š”์ง€ true, false๋กœ ๋ฐ˜ํ™˜

stack.size(); // stack์˜ size ๋ฐ˜ํ™˜

stack.empty(); // stack์ด ๋น„์–ด์žˆ๋Š”์ง€ true, false๋กœ ๋ฐ˜ํ™˜

stack.clear(); // stack๋‚ด์˜ ๋ชจ๋“  ๊ฐ’์„ ์ง€์›€ 

 

์ด๋Ÿฌํ•œ stack์„ java์—์„œ importํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. ArrayList ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

2. ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

 

๋จผ์ € ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ ArrayList๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ , ์ƒ์„ฑ์ž์—์„œ ArrayList ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋’ค isEmpty, push, pop, peek, printStack ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ stack์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ArrayList์—์„œ์˜ ๊ตฌํ˜„๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‹ ๊ฒฝ์จ์ฃผ์–ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋˜ ์žˆ๋‹ค.

๋ฐ”๋กœ isFull ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์‹ ๊ฒฝ์จ์„œ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด List์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐฐ์—ด์€ ๊ณต๊ฐ„์ด ํ•œ์ •๋˜์–ด ์žˆ๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ push, pop ํ•จ์ˆ˜ ๋‚ด์—์„œ top ๊ด€๋ฆฌ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋ฉฐ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. 

 

 

Stack์„ ์ด์šฉํ•œ ๋Œ€ํ‘œ ๋ฌธ์ œ

1. ๋ฌธ์ž์—ด ๊ฑฐ๊ฟ€๋กœ ์ถœ๋ ฅํ•˜๊ธฐ

   ใ„ด ๋ฌธ์ž์—ด์„ stack์— ์ €์žฅ ํ›„ pop์œผ๋กœ ๊บผ๋‚ด์„œ result์— ๋ถ™์ด๊ธฐ

2. ๊ด„ํ˜ธ ์ง ๊ฒ€์‚ฌ 

  ใ„ด ์—ฌ๋Š” ๊ด„ํ˜ธ๋Š” stack์— push, ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด popํ•ด์ฃผ๊ธฐ ์ค‘๊ฐ„์— stack์ด empty์ด๊ฑฐ๋‚˜ ๋งˆ์ง€๋ง‰์— stack์ด empty๊ฐ€ ์•„๋‹ˆ๋ฉด false๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

 

์ด ๋‘๊ฐœ๋Š” stack์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ stack์„ ์ด์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ์ ์€ Big O ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

Stack์ด์šฉํ•ด์„œ ํ‘ผ ๋ฌธ์ œ๋“ค ์ฒจ๋ถ€ 

1. ๋ฐฑ์ค€ 25556๋ฒˆ : ํฌ์Šคํƒ

package baekjoon.dataStructure.stack;

import java.io.*;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

/*
* ์ž๋ฃŒ๊ตฌ์กฐ : Stack
* ๋ฐฑ์ค€ 25556๋ฒˆ ๋ฌธ์ œ
* ํฌ์Šคํƒ
* */
public class Num25556 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(System.out)));

        int n = Integer.parseInt(br.readLine());
        int[] permutation = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i=0; i<n; i++){
            permutation[i] = Integer.parseInt(st.nextToken());
        }

        boolean result = ascendingOrder(n,permutation);
        if(result){
            bw.write("YES");
        }else{
            bw.write("NO");
        }
        bw.close();

    }

    public static boolean ascendingOrder(int n, int[] permutation){
        Stack stack01 = new Stack();
        Stack stack02 = new Stack();
        Stack stack03 = new Stack();
        Stack stack04 = new Stack();


        for(int i=0; i<n; i++){
            if(stack01.empty() || (int)stack01.peek() < permutation[i]){
                stack01.push(permutation[i]);
            }else if(stack02.empty() || (int)stack02.peek() < permutation[i]){
                stack02.push(permutation[i]);
            }else if(stack03.empty() || (int)stack03.peek() < permutation[i]){
                stack03.push(permutation[i]);
            }else if(stack04.empty() || (int)stack04.peek() < permutation[i]){
                stack04.push(permutation[i]);
            }else{
                return false;
            }
        }
        // ๋ฌธ์ œ์—์„œ๋Š” ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€๋งŒ ํŒ๋ณ„ํ•˜๋ผ๊ณ  ํ–ˆ๊ธฐ์— ์—ฌ๊ธฐ๊นŒ์ง€์ด์ง€๋งŒ
        // ์ •๋ ฌ๋œ ๊ฐ’์„ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
        // ์œ„์—์„œ ์Šคํƒ์— ์ •๋ฆฌํ•œ ๋’ค ๋ชจ๋“  ๊ฐ’์„ ๋‹ค ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด
        // 4๊ฐœ์˜ ์Šคํƒ peek() ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ œ์ผ ํฐ ๊ฐ’ ๋จผ์ € ๋’ค๋กœ ๋ฐฐ์น˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ
        return true;
    }
}

๋ฌธ์ œ ํ’€์ด:

๋จผ์ € ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ for๋ฌธ์„ ํ†ตํ•ด 4๊ฐœ์˜ stack์— push ํ•œ๋‹ค.

์ด๋•Œ

1. stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ๊ฐ’์„ push ํ•œ๋‹ค.

2. ํ•ด๋‹น stack์ด ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด stack์˜ peek ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด pushํ•œ๋‹ค.

2. ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋” ์ž‘๋‹ค๋ฉด ๋‹ค์Œ stack ๊ณผ ๋น„๊ตํ•œ๋‹ค. (ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์„๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์Šคํƒ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ 1~2 ์ง„ํ–‰)

3. ๋ชจ๋“  stack๊ณผ ๋น„๊ตํ–ˆ์Œ์—๋„ ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ๊ฐ’์„ ๋„ฃ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด for๋ฌธ์„ ๋‚˜์™€ false๋ฅผ return ํ•œ๋‹ค.

4. ๋งŒ์•ฝ stack์— ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค๋ฉด ๋ฐฐ์—ด์˜ i+1๋ฒˆ์งธ ๊ฐ’์„ 1๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜์—ฌ for๋ฌธ์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

 

2. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ๊ฐ™์€ ์ˆซ์ž๋Š” ์‹ซ์–ด 

package baekjoon.dataStructure.stack;
import java.util.*;
public class programmers_๊ฐ™์€์ˆซ์ž๋Š”์‹ซ์–ด {
    /*
        < ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ๊ฐ™์€ ์ˆซ์ž๋Š” ์‹ซ์–ด >
        ๋ฌธ์ œ ๋ถ„๋ฅ˜ :  stack / queue
        ์ฃผ์–ด์ง„ ๋ฐฐ์—ด arr์—์„œ ์—ฐ์†๋˜๋Š” ์ˆ˜๊ฐ€ ์žˆ์„๋•Œ ์ˆซ์ž ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ๊ณ  ์ „๋ถ€ ์ œ๊ฑฐ
        ex) arr = [1, 1, 3, 3, 0, 1, 1] ์ด๋ฉด [1, 3, 0, 1] ์„ return
    */
    public int[] solution(int []arr) {
        Stack stack = new Stack();
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (stack.empty() || ((int) stack.peek() != arr[i])) {
                stack.push(arr[i]);
                count++;
            }
        }
        int[] answer = new int[count];
        for (int i = 0; i < count; i++) {
            answer[count - 1 - i] = (int) stack.pop();
        }

        return answer;
    }
}

๋ฌธ์ œ ํ•ด์„ค : 

1. for ๋ฌธ์„ ๋Œ๋ ค stack์˜ peek๊ฐ’๊ณผ ํ•ด๋‹น ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

2. peek๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด stack์— ํ•ด๋‹น ๊ฐ’์„ push ํ•œ๋‹ค.

3. ์—ฐ์†๋œ ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ์ œ๊ฑฐ ๋œ ์ƒํƒœ๋กœ stack์— ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น stack์˜ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ฐ’์„ ์˜ฎ๊ธด๋‹ค(stack์€ LIFO์ด๋ฏ€๋กœ)