stack์ ํ์
์ ์ถ (LIFO)์ด๋ ํน์ฑ์ ๊ฐ์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ฃผ๋ก ํจ์์ฝ ์คํ, ์์ ๊ณ์ฐ, ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ๋ฑ์ ์ฌ์ฉ๋๋ค.
์คํ์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋น๋ฒํ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ *๊ฒ์์ด๋ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๊ฐ ํฌ๊ฒ ์ข์ง ์์ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
stack์ push๋ฅผ ํตํด ์ ๋ ฅํ๊ณ pop์ ํตํด ์ถ๋ ฅํ๋ค. ๋ํ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ ๊ฐ์ bottom์ผ๋ก ํ์ํ๊ณ ๊ฐ์ฅ ๋์ค์ ๋ค์ด๊ฐ ๊ฐ์ top์ผ๋ก ๊ด๋ฆฌํ๋ค.
Stack์ ์๊ฐ ๋ณต์ก๋
- ์ฝ์ / ์ญ์ : O(1)
- ๊ฒ์ : O(n) (๋ชจ๋ ์์๋ค์ ํ์ธํด์ผํ๋ค)
- ์ ๋ ฌ : 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์ด๋ฏ๋ก)
'์๊ณ ๋ฆฌ์ฆ > ์๋ฃ๊ตฌ์กฐ ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HashMap - ์๋ฃ๊ตฌ์กฐ (0) | 2024.06.20 |
---|---|
Array(๋ฐฐ์ด) - (์ ํ)์๋ฃ๊ตฌ์กฐ (0) | 2024.06.19 |
Queue - ์ ํ ์๋ฃ๊ตฌ์กฐ (0) | 2024.06.18 |
์ ํ์๋ฃ๊ตฌ์กฐ - ๋ฐํฌ (0) | 2023.08.05 |
์๋ฃ๊ตฌ์กฐ - ์ฐ์ ์์ ํ (0) | 2023.05.22 |