๐Ÿต java

[JAVA] Stack์ด๋ž€ ? (์‚ฌ์šฉ๋ฒ•, ๊ด€๋ จ ๋ฌธ์ œ ํ’€์ด)

c0zi 2024. 1. 24. 16:01

Stack

 

์˜ค๋Š˜ stack์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋ฉด์„œ, ์ •์˜์™€ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ  ๋ฌธ์ œ ํ’€์ด๋ฅผ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค.

Stack๊ณผ Queue

 

๋จผ์ €, Stack์€ ์ด๋ฆ„์—์„œ๋„ ๋А๊ปด์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

 

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋ ค๋ฉด, ์ ‘์‹œ๋ฅผ ์Œ“์•„์˜ฌ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆผ์—์„œ ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ฐ‘๋ถ€๋ถ„์ด ๋ง‰ํ˜€์žˆ๋Š” ์ƒ์ž์— ์ ‘์‹œ๋ฅผ ์Œ“์•„์˜ฌ๋ฆฌ๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋•Œ๋„ ๊ฐ€์žฅ ์œ„์— ๋„ฃ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ๋‚ผ๋•Œ๋„ ๊ฐ€์žฅ ์œ„์—์„œ ๋นผ๊ฒŒ ๋œ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ LIFO(Last In First Out)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋Ÿฐ Stack๊ณผ ์ž์ฃผ ๋น„๊ต๋˜๋Š” Queue๋Š” FIFO ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ํ„ฐ๋„์— ๋น„์œ ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’ป Stack ์‚ฌ์šฉ๋ฒ•

 

import java.util.Stack;

public class Stack {
	public static void main(String[] args) {
    	Stack<Integer> stack = new Stack<>();
    }
}

 

stack์€ java.util.Stack ํด๋ž˜์Šค๋ฅผ importํ•˜๊ณ  Stack์„ ์œ„์™€ ๊ฐ™์ด ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ƒ Stack ๊ด€๋ จ ๋ฉ”์†Œ๋“œ

 

๋ฐ์ดํ„ฐ ์ถ”๊ฐ€, push()

 

๊ฐ€์žฅ ๋จผ์ €,๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” push() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. push(E e) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ์›์†Œ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด, ๊ฐ€์žฅ ์œ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ Stack์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Top์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

import java.util.Stack;

public class Stack {
	public static void main(String[] args) {
    	Stack<Integer> stack = new Stack<>();
        
        for(int i = 0; i < 3; i++) {
        	stack.push(i);
        }
    }
}

 

์œ„ ์ฝ”๋“œ๋Š” stack์— 0, 1, 2๋ฅผ ์ฐจ๋ก€๋กœ ๋„ฃ๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.

 

๋ฐ์ดํ„ฐ ์กฐํšŒ, peek()

 

๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์ด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์—ญ์‹œ ํ•„์š”ํ•˜๋‹ค. ์Šคํƒ์—์„œ๋Š” peek()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Top ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

import java.util.Stack;

public class Stack {
	public static void main(String[] args) {
    	Stack<Integer> stack = new Stack<>();
        
        for(int i = 0; i < 3; i++) {
        	stack.push(i);
        }
        
        System.out.print(stack.peek() + " ");
	System.out.print(stack.peek() + " ");
    }
}

 

๊ฒฐ๊ณผ : 4 4

 

peek()์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ€์žฅ ์œ„(์ตœ๊ทผ) ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋ชจ๋‘ 4๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

๋ฐ์ดํ„ฐ ๋นผ๋‚ด๊ธฐ, pop()

 

๋ฐ์ดํ„ฐ๋ฅผ ๋นผ๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” pop()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

import java.util.Stack;

public class Stack {
    public static void main(String[] args) {
    	Stack<Integer> stack = new Stack<>();
    	
    	for (int i = 0; i < 3; i++) 
	    stack.push(i);
			
        while(!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
}

 

๊ฒฐ๊ณผ : 2 1 0

 

์œ„์—์„œ ๋‚˜์˜ค๋Š” isEmpty()๋Š” stack์ด ๋น„์—ˆ๋Š”์ง€ ์›์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์ค€๋‹ค. ์›์†Œ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‚˜๋Š” stack์ด ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ๊ณ„์† stack์˜ ์›์†Œ๋ฅผ ๋นผ๋‚ผ ๊ฒƒ์ด๋ฏ€๋กœ !stack.isEmpty()๋ฅผ while ๋ฐ˜๋ณตํ•ด print ํ•œ๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ stack์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ๊ทผ(๋’ค)์˜ ์›์†Œ๋ฅผ ๋นผ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ํ”ํžˆ ์ƒ๊ฐํ•˜๋Š” 0 1 2๋กœ ์ถœ๋ ฅ๋˜๋Š”๊ฒŒ ์•„๋‹Œ, 2 1 0์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค ! ์ด์™€ ๊ด€๋ จํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ฉด์„œ ๊ฐ์„ ์ตํ˜€๋ณด์ž

 


๐Ÿ“Œ ๋ฌธ์ œ ํ’€์ด

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค stack ๋ฌธ์ œ ๋งํฌ (stack์œผ๋กœ ํ’€์–ด๋ณผ ๊ฒƒ)

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

ํ•ญ์ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ๊ฐ™์ด ํ‘ธ๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ก  ๊ณต๋ถ€๋ฅผ ํ•œ ๋’ค์— ๋ฐ”๋กœ ์ฐพ์•„ ํ’€์–ด๋ณด์•˜๋‹ค. stack ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๋ถ„์ด๋ผ๋ฉด ํ’€์ด๋ฅผ ๋ณด๊ธฐ ์ „์— stack์„ ์‚ฌ์šฉํ•ด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅ ๋“œ๋ฆฐ๋‹ค.

 

๋ฌธ์ œ ์„ค๋ช…

 

๋ฐฐ์—ด arr๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฐฐ์—ด arr์˜ ๊ฐ ์›์†Œ๋Š” ์ˆซ์ž 0๋ถ€ํ„ฐ 9๊นŒ์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด๋•Œ, ๋ฐฐ์—ด arr์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ˆซ์ž๋Š” ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ๊ณ  ์ „๋ถ€ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

๋‹จ, ์ œ๊ฑฐ๋œ ํ›„ ๋‚จ์€ ์ˆ˜๋“ค์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด arr์˜ ์›์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค๋ฉด,
arr = [1, 1, 3, 3, 0, 1, 1] ์ด๋ฉด [1, 3, 0, 1] ์„ return ํ•ฉ๋‹ˆ๋‹ค.
arr = [4, 4, 4, 3, 3] ์ด๋ฉด [4, 3] ์„ return ํ•ฉ๋‹ˆ๋‹ค.
๋ฐฐ์—ด arr์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ˆซ์ž๋Š” ์ œ๊ฑฐํ•˜๊ณ  ๋‚จ์€ ์ˆ˜๋“ค์„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๋ฐฐ์—ด arr์˜ ํฌ๊ธฐ : 1,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ๋ฐฐ์—ด arr์˜ ์›์†Œ์˜ ํฌ๊ธฐ : 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ  9๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜

 

๋ฌธ์ œ ํ’€์ด

 

 

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        
        Stack<Integer> stack = new Stack<>();
        
        for(int i : arr) {
            if(stack.isEmpty() || i != stack.peek()) {
                stack.push(i);
            }
        }
        
        int[] answer = new int[stack.size()];

        for(int i = stack.size() -1; i >= 0; i--) {
            answer[i] = stack.pop();
        }
        
        return answer;
    }
}

 

1. stack ์„ ์–ธ ํ›„ arr ๊ธธ์ด๋งŒํผ foreach๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • stack์˜ top ๋ฐ์ดํ„ฐ๊ฐ€ i(๊ธฐ์กด ๋ฐฐ์—ด์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’)์™€ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด, stack์— i ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
  • ๊ฐ€์žฅ ์ฒ˜์Œ์—๋Š” stack์ด ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ stack.peek()๋กœ ๋น„๊ตํ•˜๋ฉด EmptyStackException์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋น„์–ด์žˆ๋Š”์ง€๋„ ํ•จ๊ป˜ ํ™•์ธ ํ•ด์ค€๋‹ค. => stack.isEmpty()

2. stack์˜ ํฌ๊ธฐ๋งŒํผ int ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ค€๋‹ค.

3. stack์˜ ํฌ๊ธฐ๋ฅผ n์ด๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, index i๋ฅผ n-1๋ถ€ํ„ฐ 0๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋„๋ก ํ•˜์—ฌ ์ •๋‹ต ๋ฐฐ์—ด์— stack์›์†Œ๋“ค์„ ๋„ฃ์–ด์ค€๋‹ค.

  • stack์€ ์ตœ๊ทผ ๊ฐ’๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์—, index๋ฅผ ์—ญ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐฐ์—ด์ด ๊ฑฐ๊พธ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
  • โญ ์ด ๋ถ€๋ถ„์ด ๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด์ž stack์˜ ์ •์˜์—์„œ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.  โญ

์ถœ์ฒ˜

1. stack, queue ์ด๋ฏธ์ง€

https://velog.io/@lsx2003/%EC%8A%A4%ED%83%9DStack-%EA%B5%AC%ED%98%84

 

[์ž๋ฃŒ๊ตฌ์กฐ] Stack

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ž๋ฃŒ๊ตฌ์ข… ์ค‘์—์„œ ์Šคํƒ(Stack)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์€ Last In First Out ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.

velog.io