์คํ(Stack)
๊ฐ์
"์คํ"์ ๋ฐ์ดํฐ๋ฅผ ์์์ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๋ก, "ํ์ ์ ์ถ(LIFO, Last In First Out)" ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ์ฆ, ๋์ค์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋์ค๋ ๊ตฌ์กฐ์ด๋ค. ์คํ์ ์ฃผ๋ก ํจ์ ํธ์ถ, ๊ณ์ฐ๊ธฐ ํ๋ก๊ทธ๋จ์์ ์์ ๊ณ์ฐ, ๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก ๊ฐ๊ธฐ ๊ธฐ๋ฅ ๋ฑ์์ ์ฌ์ฉ๋๋ค.
* ์ด์ ๋ฐ๋์ "์ ์ ์ ์ถ(FIFO, First In First Out)" ๊ตฌ์กฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ 'ํ'๋ผ๊ณ ํ๋ค.
์คํ์ ํ์ฉํ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ ์ ํ์ด ์ ํด์ ธ ์๋ค. ๋ฌธ์ ๋ฅผ ์ ์ฝ์ด๋ณด๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ ์ฌ๋ฆฐ๋ค๋ ์ง, ๋์ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ฉด ์คํ์ ํ์ฉํ๋ฉด ๋๋ค.
์คํ์ ์ฌ์ฉํ๋ ๋ฌธ์ ์ ํ
โ ๊ดํธ ์ ํจ์ฑ ๊ฒ์ฌ
- ์ฃผ์ด์ง ๋ฌธ์์ด์์ ๊ดํธ์ ์ง์ด ๋ง๋์ง ํ์ธํ๋ ๋ฌธ์
- ์คํ์ ์ฌ์ฉํด ์ฌ๋ ๊ดํธ๋ ์คํ์ ๋ฃ๊ณ , ๋ซ๋ ๊ดํธ๋ ์คํ์์ ํ๋์ฉ ๊บผ๋ด๋ฉฐ ๋งค์นญ์ ํ์ธํ๋ค.
"()" → ์ ํจ
"({[()]})" → ์ ํจ
"([)]" → ์ ํจํ์ง ์์
โ ํ์ ํ๊ธฐ๋ฒ ๊ณ์ฐ
- ์์์ด ํ์ ํ๊ธฐ๋ฒ์ผ๋ก ์ฃผ์ด์ก์ ๋ ๊ณ์ฐํ๋ ๋ฌธ์
- ํ์ ํ๊ธฐ๋ฒ์์ ์ซ์๋ ์คํ์ ๋ฃ๊ณ , ์ฐ์ฐ์๋ ์คํ์์ ์ซ์๋ฅผ ๊บผ๋ด ๊ณ์ฐ ํ ๋ค์ ์คํ์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
"2 3 + 5 *" → 25
โ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ
- ํ์คํ ๊ทธ๋จ ํํ์ ๋ง๋๊ทธ๋ํ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ์ฐพ๋ ๋ฌธ์
- ์คํ์ ์ด์ฉํด ๊ฐ ๋ง๋์ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง์ฌ๊ฐํ์ ์ต๋ ๋ฉด์ ์ ๊ณ์ฐํ๋ค.
[2, 1, 5, 6, 2, 3] → ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋ฉด์ ์ 10
โ ๋ฐฐ์ด์์ ๋ ๋ฒ์งธ๋ก ํฐ ์ ์ฐพ๊ธฐ
- ์ฃผ์ด์ง ๋ฐฐ์ด์์ ๋ ๋ฒ์งธ๋ก ํฐ ๊ฐ์ ์ฐพ๋ ๋ฌธ์
- ์คํ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ํ ๋ฒ ์ํํ๋ฉด์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ์ฐพ์๋ธ๋ค.
[5, 1, 7, 3, 9] → ๋ ๋ฒ์งธ๋ก ํฐ ์๋ 7
โ ์ฃผ์๊ฐ๊ฒฉ ๋ฌธ์ (์คํ์ ์ด์ฉํ ์ต๋๊ฐ ๊ตฌํ๊ธฐ)
- ์ฃผ์ด์ง ์ฃผ์์ ๊ฐ๊ฒฉ์์ ์ค๋์ ์ฃผ์ ๊ฐ๊ฒฉ์ ๊ธฐ์ค์ผ๋ก ๋ช ์ผ ์ ๋ถํฐ ๊ฐ๊ฒฉ์ด ๋ ๋์๋์ง ๊ตฌํ๋ ๋ฌธ์
- ์คํ์ ์ฌ์ฉํ์ฌ ๊ฐ๊ฒฉ์ ๊ธฐ๋กํ๋ฉด์ ์ต๋๊ฐ์ ์ฐพ์๊ฐ๋ ๋ฐฉ์
- ๊ฐ ๊ฐ๊ฒฉ์ ๋ํด, ๊ทธ ๊ฐ๊ฒฉ๋ณด๋ค ๋ ๋์ ๊ฐ๊ฒฉ์ด ๋์จ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ฐพ๋ ๊ฒ์ด ๊ด๊ฑด
- ์คํ์ ๊ฐ๊ฒฉ๊ณผ ํด๋น ๋ ์ง๋ฅผ ์์ผ๋ก ์ ์ฅ
- ํ์ฌ ๊ฐ๊ฒฉ๋ณด๋ค ์์ ๊ฐ๊ฒฉ์ด ๋์ฌ ๋๊น์ง ์คํ์์ ๊บผ๋ด๊ณ , ๊ทธ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ์ ์ ์ฅ
- ์คํ์ ํ์ฌ ๊ฐ๊ฒฉ์ ์ถ๊ฐ
- ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ๊ฐ๊ฒฉ์ ๋ํด ๋ช ์ผ ์ ๋ถํฐ ๊ฐ๊ฒฉ์ด ๋ ๋์๋์ง๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌํ ์ ์๋ค.
[1, 2, 3, 2, 3] → [0, 1, 2, 1, 4]
โ ์ต์๊ฐ ๊ตฌํ๊ธฐ
- ์คํ์ ์์๋ฅผ ๋ฃ์ ๋๋ง๋ค ํ์ฌ ์คํ ๋ด์ ์ต์๊ฐ์ ์ถ์ ํด์ผ ํ๋ ๋ฌธ์
- ์คํ์ ๊ฐ์ ๋ฃ์ ๋, ๊ฐ ๊ฐ๊ณผ ํจ๊ป ํ์ฌ๊น์ง์ ์ต์๊ฐ์ ํจ๊ป ์ ์ฅํ๋ค.
- ์๋ฅผ ๋ค์ด, ๊ฐ x๋ฅผ ์คํ์ ๋ฃ์ ๋, ํ์ฌ ์คํ์ ์ต์๊ฐ์ min_value๋ผ๊ณ ํ ๋, ์๋ก์ด ์ต์๊ฐ์ min(min_value, x)๋ก ์ค์ ํ์ฌ ํจ๊ป ์ ์ฅํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด, ์คํ์์ ๊ฐ์ ๊บผ๋ผ ๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
push(3), push(1), push(2), pop() → ์ต์๊ฐ์ 1
์๋ฐ๋ก ์คํ ๊ตฌํ
์์ค์ฝ๋
package algo03.StackAndQueue;
public class myStack {
public static void main(String[] args) {
// ์คํ ๊ตฌํํ ์ฝ๋
// Stack์ ํ์
์ ์ถ(LIFO, Last In First Out) ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅํจ
StackExample stack = new StackExample(5); // ํฌ๊ธฐ๊ฐ 5์ธ ์คํ ์์ฑ
// ์คํ์ ๊ฐ ์ถ๊ฐ
stack.push(10);
stack.push(20);
stack.push(30);
// ์คํ์ ๊ฐ์ฅ ์๋จ ๊ฐ ํ์ธ
System.out.println("์คํ์ ๊ฐ์ฅ ์๋จ ๊ฐ: " + stack.peek());
// ์คํ์์ ๊ฐ ์ ๊ฑฐ
System.out.println("pop: " + stack.pop());
System.out.println("pop: " + stack.pop());
// ์คํ์ด ๋น์๋์ง ํ์ธ
System.out.println("์คํ์ด ๋น์๋์? " + stack.isEmpty());
// ์คํ์ ํฌ๊ธฐ ํ์ธ
System.out.println("์คํ ํฌ๊ธฐ: " + stack.size());
// ์คํ์์ ๊ฐ์ ๋ ์ ๊ฑฐ
System.out.println("pop: " + stack.pop());
System.out.println("pop: " + stack.pop()); // ์ด๋๋ ์คํ์ด ๋น์ด ์์
}
// StackExample ํด๋์ค ์ ์
public static class StackExample {
// Stack์ ๊ตฌํํ ๋ฐฐ์ด
private int[] stack;
private int top; // ์คํ์ ๊ฐ์ฅ ์๋จ ์ธ๋ฑ์ค๋ฅผ ์ถ์
// ์์ฑ์: ์คํ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ฌ ๋ฐฐ์ด์ ์ด๊ธฐํ
public StackExample(int size) {
stack = new int[size]; // ์ฃผ์ด์ง ํฌ๊ธฐ์ ๋ฐฐ์ด์ ์์ฑ
top = -1; // ์คํ์ด ๋น์ด์์ผ๋ฏ๋ก top์ -1๋ก ์ด๊ธฐํ
}
// ์คํ์ ๊ฐ์ ์ถ๊ฐํ๋ ๋ฉ์๋
public void push(int value) {
// ์คํ์ด ๊ฝ ์ฐผ์ ๋ ์์ธ ์ฒ๋ฆฌ
if (top == stack.length - 1) {
System.out.println("์คํ์ด ๊ฝ ์ฐผ์ต๋๋ค.");
} else {
stack[++top] = value; // top์ 1 ์ฆ๊ฐ์ํค๊ณ ๊ฐ์ ์ถ๊ฐ
System.out.println(value + "์ด(๊ฐ) ์คํ์ ์ถ๊ฐ๋์์ต๋๋ค.");
}
}
// ์คํ์์ ๊ฐ์ ์ ๊ฑฐํ๊ณ ๋ฐํํ๋ ๋ฉ์๋
public int pop() {
// ์คํ์ด ๋น์์ ๋ ์์ธ ์ฒ๋ฆฌ
if (top == -1) {
System.out.println("์คํ์ด ๋น์ด ์์ต๋๋ค.");
return -1; // ์คํ์ด ๋น์์ผ๋ฉด -1 ๋ฐํ
} else {
int poppedValue = stack[top--]; // top์์ ๊ฐ์ ๊บผ๋ด๊ณ top์ 1 ๊ฐ์
return poppedValue; // ๊บผ๋ธ ๊ฐ ๋ฐํ
}
}
// ์คํ์ ๊ฐ์ฅ ์๋จ ๊ฐ์ ๋ฐํํ๋ ๋ฉ์๋ (๊ฐ์ ์ ๊ฑฐํ์ง ์์)
public int peek() {
// ์คํ์ด ๋น์์ ๋ ์์ธ ์ฒ๋ฆฌ
if (top == -1) {
System.out.println("์คํ์ด ๋น์ด ์์ต๋๋ค.");
return -1; // ์คํ์ด ๋น์์ผ๋ฉด -1 ๋ฐํ
} else {
return stack[top]; // top์ ์๋ ๊ฐ ๋ฐํ
}
}
// ์คํ์ด ๋น์๋์ง ํ์ธํ๋ ๋ฉ์๋
public boolean isEmpty() {
return top == -1; // top์ด -1์ด๋ฉด ์คํ์ด ๋น์ด ์๋ค๋ ์๋ฏธ
}
// ์คํ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
public int size() {
return top + 1; // top ์ธ๋ฑ์ค + 1์ด ์คํ์ ํฌ๊ธฐ
}
}
}
์์ 1 - 10์ง์๋ฅผ 2์ง์๋ก (decimalToBinary.java)
10์ง์๋ฅผ ์ ๋ ฅ๋ฐ์ 2์ง์๋ก ๋ณํํด ๋ฐํํ๋ solution() ํจ์๋ฅผ ๊ตฌํํ์ธ์
์ ํ ์กฐ๊ฑด
- decimal์ 1์ด์ 10์ต ๋ฏธ๋ง์ ์์ฐ์
์ ์ถ๋ ฅ ์
decimal | return |
10 | 1010 |
27 | 11011 |
12345 | 11000000111001 |
์์
- ์ฃผ์ด์ง ์ญ์ง์๋ฅผ 2๋ก ๋๋๋ฉฐ ๋๋จธ์ง๋ฅผ ์คํ์ ์๊ณ , ๋์ค์ ์คํ์์ ํ๋์ฉ ๊บผ๋ด๋ฉด ์ด์ง์๊ฐ ๋์จ๋ค.
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Stack;
public class queue_decimalToBinary {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public static String solution(int decimal) {
// 10์ง์๋ฅผ 2์ง์๋ก
Stack<Integer> stack = new Stack<>(); // ๋๋จธ์ง๋ฅผ ์ ์ฅํ ์คํ
while (decimal != 0) { // ๋ชซ์ด 0์ด ๋ ๋ ๊น์ง ๋ฐ๋ณต
stack.push(decimal % 2); // ๋๋จธ์ง ์คํ์ ๋ฃ๊ธฐ
decimal /= 2; // 2๋ก ๋๋๊ธฐ
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop()); // ์คํ์ ์๋ ๋๋จธ์ง ๊บผ๋ด๊ธฐ
}
return sb.toString();
}
}
[์ฝ๋ฉํ ์คํธ] (Java) ์ญ์ง์๋ฅผ ์ด์ง์๋ก ๋ณํํ๊ธฐ (์คํ)
๐ 1. ๋ฌธ์ ์ค๋ช 10์ง์๋ฅผ ์ ๋ ฅ๋ฐ์ 2์ง์๋ก ๋ณํํด ๋ฐํํ๋ solution() ํจ์๋ฅผ ๊ตฌํํ์ธ์ ์ ์ฝ์กฐ๊ฑดdecimal์ 1์ด์ 10์ต ๋ฏธ๋ง์ ์์ฐ์์ ์ถ๋ ฅ ์decimalreturn10101027110111234511000000111001 ๐ก 2. ํ์ด ๊ณผ์ 10
awesomepossum.tistory.com
์์ 2 - ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (craneGame.java)
๊ฒ์๊ฐ๋ฐ์์ธ "์ฃ ๋ฅด๋"๋ ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ธฐ๊ณ๋ฅผ ๋ชจ๋ฐ์ผ ๊ฒ์์ผ๋ก ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. "์ฃ ๋ฅด๋"๋ ๊ฒ์์ ์ฌ๋ฏธ๋ฅผ ๋์ด๊ธฐ ์ํด ํ๋ฉด ๊ตฌ์ฑ๊ณผ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์ ๋ก์ง์ ๋ฐ์ํ๋ ค๊ณ ํฉ๋๋ค.
๊ฒ์ ํ๋ฉด์ "1 x 1" ํฌ๊ธฐ์ ์นธ๋ค๋ก ์ด๋ฃจ์ด์ง "N x N" ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์์ด๋ฉฐ ์์ชฝ์๋ ํฌ๋ ์ธ์ด ์๊ณ ์ค๋ฅธ์ชฝ์๋ ๋ฐ๊ตฌ๋๊ฐ ์์ต๋๋ค. (์ ๊ทธ๋ฆผ์ "5 x 5" ํฌ๊ธฐ์ ์์์ ๋๋ค). ๊ฐ ๊ฒฉ์ ์นธ์๋ ๋ค์ํ ์ธํ์ด ๋ค์ด ์์ผ๋ฉฐ ์ธํ์ด ์๋ ์นธ์ ๋น์นธ์ ๋๋ค. ๋ชจ๋ ์ธํ์ "1 x 1" ํฌ๊ธฐ์ ๊ฒฉ์ ํ ์นธ์ ์ฐจ์งํ๋ฉฐ ๊ฒฉ์์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ ์์ต๋๋ค. ๊ฒ์ ์ฌ์ฉ์๋ ํฌ๋ ์ธ์ ์ข์ฐ๋ก ์์ง์ฌ์ ๋ฉ์ถ ์์น์์ ๊ฐ์ฅ ์์ ์๋ ์ธํ์ ์ง์ด ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ง์ด ์ฌ๋ฆฐ ์ธํ์ ๋ฐ๊ตฌ๋์ ์์ด๊ฒ ๋๋ ๋ฐ, ์ด๋ ๋ฐ๊ตฌ๋์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ธํ์ด ์์๋๋ก ์์ด๊ฒ ๋ฉ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์ [1๋ฒ, 5๋ฒ, 3๋ฒ] ์์น์์ ์์๋๋ก ์ธํ์ ์ง์ด ์ฌ๋ ค ๋ฐ๊ตฌ๋์ ๋ด์ ๋ชจ์ต์ ๋๋ค.
๋ง์ฝ ๊ฐ์ ๋ชจ์์ ์ธํ ๋ ๊ฐ๊ฐ ๋ฐ๊ตฌ๋์ ์ฐ์ํด์ ์์ด๊ฒ ๋๋ฉด ๋ ์ธํ์ ํฐ๋จ๋ ค์ง๋ฉด์ ๋ฐ๊ตฌ๋์์ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ ์ํ์์ ์ด์ด์ [5๋ฒ] ์์น์์ ์ธํ์ ์ง์ด ๋ฐ๊ตฌ๋์ ์์ผ๋ฉด ๊ฐ์ ๋ชจ์ ์ธํ ๋ ๊ฐ๊ฐ ์์ด์ง๋๋ค.
ํฌ๋ ์ธ ์๋ ์ ์ธํ์ด ์ง์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ ๋ง์ฝ ์ธํ์ด ์๋ ๊ณณ์์ ํฌ๋ ์ธ์ ์๋์ํค๋ ๊ฒฝ์ฐ์๋ ์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ํ ๋ฐ๊ตฌ๋๋ ๋ชจ๋ ์ธํ์ด ๋ค์ด๊ฐ ์ ์์ ๋งํผ ์ถฉ๋ถํ ํฌ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (๊ทธ๋ฆผ์์๋ ํ๋ฉดํ์ ์ ์ฝ์ผ๋ก 5์นธ๋ง์ผ๋ก ํํํ์์) ๊ฒ์ ํ๋ฉด์ ๊ฒฉ์์ ์ํ๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด board์ ์ธํ์ ์ง๊ธฐ ์ํด ํฌ๋ ์ธ์ ์๋์ํจ ์์น๊ฐ ๋ด๊ธด ๋ฐฐ์ด moves๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ํฌ๋ ์ธ์ ๋ชจ๋ ์๋์ํจ ํ ํฐํธ๋ ค์ ธ ์ฌ๋ผ์ง ์ธํ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์กฐ๊ฑด
- board ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํฌ๊ธฐ๋ "5 x 5" ์ด์ "30 x 30" ์ดํ์ ๋๋ค.
- board์ ๊ฐ ์นธ์๋ 0 ์ด์ 100 ์ดํ์ธ ์ ์๊ฐ ๋ด๊ฒจ์์ต๋๋ค.
- 0์ ๋น ์นธ์ ๋ํ๋ ๋๋ค.
- 1 ~ 100์ ๊ฐ ์ซ์๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธํ์ ๋ชจ์์ ์๋ฏธํ๋ฉฐ ๊ฐ์ ์ซ์๋ ๊ฐ์ ๋ชจ์์ ์ธํ์ ๋ํ๋ ๋๋ค.
- moves ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- moves ๋ฐฐ์ด ๊ฐ ์์๋ค์ ๊ฐ์ 1 ์ด์์ด๋ฉฐ board ๋ฐฐ์ด์ ๊ฐ๋ก ํฌ๊ธฐ ์ดํ์ธ ์์ฐ์์ ๋๋ค.
์ ์ถ๋ ฅ ์
board | moves | result |
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] | [1,5,3,5,1,2,1,4] | 4 |
์์
- ์ธํ์ ๋ฝ์ ๋๋ง๋ค ํด๋น ์ธํ์ด ์คํ์ ์ต์๋จ ์ธํ๊ณผ ๋์ผํ์ง ํ์ธํ ํ, ๋์ผํ๋ค๋ฉด ์คํ์์ ๋ ์ธํ์ ๋ชจ๋ ์ ๊ฑฐํ๊ณ ์ ์๋ฅผ 2์ ์ฆ๊ฐํ๋ค. ๋ค๋ฅด๋ฉด ์คํ์ ๊ทธ ์ธํ์ ์ถ๊ฐํ๋ค.
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Stack;
public class stack_craneGame {
public static void main(String[] args) {
int[][] board = { { 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 3 }, { 0, 2, 5, 0, 1 }, { 4, 2, 4, 4, 2 },
{ 3, 5, 1, 3, 1 } };
int[] moves = { 1, 5, 3, 5, 1, 2, 1, 4 }; // ํฌ๋ ์ธ์ด ์์ง์ด๋ ์์น ๋ฐฐ์ด
stack_craneGame game = new stack_craneGame();
int result = game.solution(board, moves);
System.out.println("ํฐ์ง ์ธํ ๊ฐ์: " + result); // ์์ ์ถ๋ ฅ: 4
}
public int solution(int[][] board, int[] moves) {
// ํ๋ก๊ทธ๋๋จธ์ค ํฌ๋ ์ธ ์ธํ๋ด
๊ธฐ ๊ฒ์ ๋ฌธ์
int answer = 0; // ํฐ์ง ์ธํ์ ์ด ๊ฐ์ (2๊ฐ์ฉ ์ฌ๋ผ์ง)
Stack<Integer> stack = new Stack<>(); // ๋ฝ์ ์ธํ์ ์ ์ฅํ ์คํ
// 'moves' ๋ฐฐ์ด์ ๊ฐ ์ด๋์ ๋ํด ๋ฐ๋ณต
for (int move : moves) {
// ๊ฐ ์ด์ ์์ฐจ์ ์ผ๋ก ํ์ธ (board.length๋ ํ์ ๊ฐ์)
for (int j = 0; j < board.length; j++) {
// ํ์ฌ ์์น์ ์ธํ์ด ์๋ค๋ฉด (0์ด ์๋ ๊ฐ)
if (board[j][move - 1] != 0) {
int doll = board[j][move - 1]; // ํด๋น ์์น์ ์ธํ์ ๊ฐ์ ธ์ด
// ์คํ์ด ๋น์ด์์ง ์๊ณ , ์คํ์ ๋งจ ์ ์ธํ๊ณผ ํ์ฌ ์ธํ์ด ๊ฐ์ผ๋ฉด
if (!stack.isEmpty() && stack.peek() == doll) {
stack.pop(); // ์ธํ์ ํฐ๋จ๋ฆฌ๊ธฐ ์ํด ์คํ์์ ์ ๊ฑฐ
answer += 2; // ๊ฐ์ ์ธํ์ด ํฐ์ ธ์ 2๊ฐ๊ฐ ์ฌ๋ผ์ง
} else {
stack.push(doll); // ์คํ์ ์ธํ์ ์ถ๊ฐ
}
board[j][move - 1] = 0; // ๋ฝ์ ์ธํ์ ํด๋น ์์น์์ ์ ๊ฑฐ (0์ผ๋ก ์ค์ )
break; // ํ ๋ฒ์ ํ๋์ ์ธํ๋ง ๋ฝ์ ์ ์์ผ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ์ ํ์ถ
}
}
}
return answer; // ํฐ์ง ์ธํ์ ์ด ๊ฐ์ ๋ฐํ
}
}
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ํฌ๋ ์ธ ์ธํ ๋ฝ๊ธฐ ๊ฒ์ (์คํ)
๐ 1. ๋ฌธ์ ์ค๋ช ๐ก 2. ํ์ด ๊ณผ์ ๋ฌธ์ ์์์ฒ๋ผ 5*5 ๊ฒฉ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๋ฉด ๊ฒฉ์์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ธํ์ด ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ ์๊ณ , ๊ฐ์ฅ ์์ ์๋ ์ธํ์ ์ง์ด ์ฌ๋ฆด ์ ์๋ค. ์ด ๋ฌธ์ ์์ "์ง์ด
awesomepossum.tistory.com
์์ 3 - ๊ฐ์ ์ซ์๋ ์ซ์ด (noMoreSameNums.java)
๋ฐฐ์ด 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๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์
์ ์ถ๋ ฅ ์
arr | answer |
[1, 1, 3, 3, 0, 1, 1] | [1, 3, 0, 1] |
[4, 4, 4, 3, 3] | [4, 3] |
์์
- ์ฐ์๋ ์ค๋ณต ์ซ์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์, ์ด์ ์ซ์์ ๋ค๋ฅผ ๋๋ง ์คํ์ ์ถ๊ฐํ๊ณ , ์ต์ข ์ ์ผ๋ก ์คํ์ ๋จ์ ์์๋ค์ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Arrays;
import java.util.Stack;
public class stack_noMoreSameNums {
public static void main(String[] args) {
// ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ ์ซ์๋ ์ซ์ด ๋ฌธ์
stack_noMoreSameNums solution = new stack_noMoreSameNums();
// ํ
์คํธ 1
int[] arr1 = { 1, 1, 3, 3, 0, 1, 1 };
System.out.println("Test 1: " + Arrays.toString(solution.solution(arr1))); // [1, 3, 0, 1]
// ํ
์คํธ 2
int[] arr2 = { 4, 4, 4, 3, 3, 2, 2 };
System.out.println("Test 2: " + Arrays.toString(solution.solution(arr2))); // [4, 3, 2]
// ํ
์คํธ 3
int[] arr3 = { 7, 8, 8, 7, 9, 7 };
System.out.println("Test 3: " + Arrays.toString(solution.solution(arr3))); // [7, 8, 9, 7]
}
public int[] solution(int[] arr) {
// ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int[] answer;
// ์คํ์ ์์ฑ (์คํ์ ์ด์ฉํด ์ค๋ณต๋ ์ซ์๋ฅผ ์ ๊ฑฐํ ๊ฒ์)
Stack<Integer> st = new Stack<>();
// ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์คํ์ ๋ฃ์
if (arr.length > 0) {
st.add(arr[0]);
}
// ๋ฐฐ์ด์ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ฉฐ ์คํ์ ๊ฐ์ฅ ์ ๊ฐ๊ณผ ๋น๊ต
for (int i = 1; i < arr.length; i++) {
// ์คํ์ ๊ฐ์ฅ ์ ๊ฐ๊ณผ ํ์ฌ ๊ฐ์ด ๋ค๋ฅด๋ฉด ์คํ์ ์ถ๊ฐ
if (st.peek() != arr[i])
st.push(arr[i]);
}
// ์คํ์ ํฌ๊ธฐ๋งํผ answer ๋ฐฐ์ด ์์ฑ
answer = new int[st.size()];
// ์คํ์ ๊ฐ์ ํ๋์ฉ ๊บผ๋ด์ด answer ๋ฐฐ์ด์ ์ ์ฅ (์คํ์ ์์๊ฐ ๋ฐ๋์ด๋ฏ๋ก ์ญ์์ผ๋ก ๋ฃ์)
for (int i = st.size() - 1; i >= 0; i--) {
answer[i] = st.pop();
}
// ๊ฒฐ๊ณผ ๋ฐฐ์ด ๋ฐํ
return answer;
}
}
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๊ฐ์ ์ซ์๋ ์ซ์ด ๋ฌธ์ ํ์ด (์คํ/ํ)
1. ๋ฌธ์ ์ค๋ช ๋ฐฐ์ด arr๊ฐ ์ฃผ์ด์ง๋๋ค. ๋ฐฐ์ด arr์ ๊ฐ ์์๋ ์ซ์ 0๋ถํฐ 9๊น์ง๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ์ด๋, ๋ฐฐ์ด arr์์ ์ฐ์์ ์ผ๋ก ๋ํ๋๋ ์ซ์๋ ํ๋๋ง ๋จ๊ธฐ๊ณ ์ ๋ถ ์ ๊ฑฐํ๋ ค๊ณ ํฉ๋๋ค. ๋จ, ์ ๊ฑฐ
awesomepossum.tistory.com
์์ 4 - ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ์ฐพ๊ธฐ (rectangularArea.java)
์ฃผ์ด์ง ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ์ธ์.
ํ์คํ ๊ทธ๋จ์ heights[i]๋ก ํํ๋๋ฉฐ, ๊ฐ ๊ฐ์ ํด๋น ์์น์ ๋ง๋ ๋์ด๋ฅผ ๋ํ๋ ๋๋ค.
์ ํ ์กฐ๊ฑด
- ์ ๋ ฅ: ๋ฐฐ์ด ๊ธธ์ด: 1 ≤ heights.length ≤ 100,000
- ๊ฐ ๋ง๋์ ๋์ด: 0 ≤ heights[i] ≤ 10^9
- ์๊ฐ: ๋ณต์ก๋ ์ ํ O(N) (์ต๋ O(N log N) ๊ฐ๋ฅ)
- ์ถ๋ ฅ: ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด (์ ์)
์ ์ถ๋ ฅ ์
์ ๋ ฅ (heights) | ์ถ๋ ฅ (๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด) |
[2, 1, 5, 6, 2, 3] | 10 |
[1, 2, 3, 4, 5] | 9 |
[5, 5, 5, 5] | 20 |
[2, 4] | 4 |
์์
- ๋์ด๊ฐ ์ฆ๊ฐํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ชจ๋ ธํ ๋ ์คํ์ ์ ์ฅํ๋ค. ํ์ฌ ๋์ด๊ฐ ์ด์ ๋ณด๋ค ์์์ง๋ ์๊ฐ ์ง์ฌ๊ฐํ์ ์ต๋ ๋์ด๋ฅผ ๊ณ์ฐํ๊ณ , ์คํ์์ ๋์ด๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉฐ heights[stack.pop()]์ ๊ธฐ์ค์ผ๋ก ๋์ด๋ฅผ ๊ณ์ฐํ๋ค.
- ๋๋น: ํ์ฌ ์ธ๋ฑ์ค - ์คํ์ ์ต์๋จ ์ธ๋ฑ์ค - 1
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Stack;
public class stack_rectangularArea {
public static void main(String[] args) {
int[] heights = { 2, 1, 5, 6, 2, 3 };
System.out.println(largestRectangleArea(heights)); // 10
}
public static int largestRectangleArea(int[] heights) {
// ํ์คํ ๊ทธ๋จ์์ ์ง์ฌ๊ฐํ ๋์ด ๊ตฌํ๊ธฐ
// ์ฃผ์ด์ง ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์
// ์คํ์ ์ฌ์ฉํ์ฌ ๋์ด๋ฅผ ์ถ์ ํ๋ฉด์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ค.
Stack<Integer> stack = new Stack<>();
int maxArea = 0;
int i = 0;
while (i < heights.length) {
if (stack.isEmpty() || heights[i] >= heights[stack.peek()]) {
stack.push(i++);
} else {
int h = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, h * width);
}
}
while (!stack.isEmpty()) {
int h = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, h * width);
}
return maxArea;
}
}
์์ 5 - ํ์ ํ๊ธฐ๋ฒ(Reverse Polish Notation, RPN) ๊ณ์ฐ๊ธฐ (reversePolish.java)
์ฃผ์ด์ง ํ์ ํ๊ธฐ๋ฒ(Reverse Polish Notation, RPN) ์์์ ๊ณ์ฐํ์ธ์.
ํ์ ํ๊ธฐ๋ฒ์ ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํ๋ ํ๊ธฐ๋ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, **"2 1 + 3 *"**๋ **"(2 + 1) * 3"**๊ณผ ๊ฐ์ ์๋ฏธ์ด๋ฉฐ, ๊ฒฐ๊ณผ๋ 9์ ๋๋ค.
์ฃผ์ด์ง ์ฐ์ฐ์ ๋ํ๊ธฐ(+), ๋นผ๊ธฐ(-), ๊ณฑํ๊ธฐ(*), ๋๋๊ธฐ(/) ๋ค ๊ฐ์ง์ ๋๋ค.
๋๋์ ์ ์ ์ ๋๋์ ์ ์๋ฏธํ๋ฉฐ, ์์์ ์ดํ๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
์ ํ ์กฐ๊ฑด
- ์ ๋ ฅ ๋ฐฐ์ด ํฌ๊ธฐ: 1 ≤ tokens.length ≤ 10^4
- ํ ํฐ ๊ฐ: ์ซ์ ๋๋ "+", "-", "*", "/" ์ค ํ๋
- ์ซ์ ๋ฒ์: -200 ≤ tokens[i] ≤ 200
- ์ฐ์ฐ ๊ฒฐ๊ณผ: ๋ฒ์ int ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์
- ์ถ๋ ฅ: ํ์ ํ๊ธฐ๋ฒ์ ๊ณ์ฐ ๊ฒฐ๊ณผ (์ ์)
์ ์ถ๋ ฅ ์
์ ๋ ฅ(token) | ์ถ๋ ฅ (๊ณ์ฐ๊ฒฐ๊ณผ) |
["2", "1", "+", "3", "*"] | 9 |
["4", "13" , "5", "/", "+"] | 6 |
["10", "6", "9", "3", "/", "*", "-"] | 4 |
์์
- ์ซ์๋ ์คํ์ pushํ๋ค. ์ฐ์ฐ์๊ฐ ๋์ค๋ฉด ์คํ์์ ๋ ๊ฐ๋ฅผ pop ํ ์ฐ์ฐํ์ฌ ๋ค์ pushํ๋ค. ๋ชจ๋ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ํ, ์ต์ข ๊ฒฐ๊ณผ๋ฅผ popํด์ ๋ฐํํ๋ค. O(N) ์๊ฐ๋ณต์ก๋๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Stack;
public class stack_reversePolish {
public static void main(String[] args) {
String[] tokens = { "2", "1", "+", "3", "*" };
System.out.println(evalRPN(tokens)); // 9
}
public static int evalRPN(String[] tokens) {
// ๋ฆฌ๋ฒ์ค Polish ํ๊ธฐ๋ฒ (ํ์ ํ๊ธฐ๋ฒ)
// ํ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์์์ ๊ณ์ฐํ๋ ๋ฌธ์
// ์คํ์ ์ฌ์ฉํ์ฌ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์๋ฅผ ์ฒ๋ฆฌ
Stack<Integer> stack = new Stack<>();
for (String token : tokens) {
if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
int b = stack.pop();
int a = stack.pop();
switch (token) {
case "+":
stack.push(a + b);
break;
case "-":
stack.push(a - b);
break;
case "*":
stack.push(a * b);
break;
case "/":
stack.push(a / b);
break;
}
} else {
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
}
์์ 6 - ์ฃผ์ ๊ฐ๊ฒฉ (stockPrices.java)
์ด ๋จ์๋ก ๊ธฐ๋ก๋ ์ฃผ์๊ฐ๊ฒฉ์ด ๋ด๊ธด ๋ฐฐ์ด prices๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์ ๊ธฐ๊ฐ์ ๋ช ์ด์ธ์ง๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- prices์ ๊ฐ ๊ฐ๊ฒฉ์ 1 ์ด์ 10,000 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- prices์ ๊ธธ์ด๋ 2 ์ด์ 100,000 ์ดํ์ ๋๋ค.
์ ์ถ๋ ฅ ์
prices | return |
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
์ ์ถ๋ ฅ ์ ์ค๋ช
- 1์ด ์์ ์ โฉ1์ ๋๊น์ง ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์์ต๋๋ค.
- 2์ด ์์ ์ โฉ2์ ๋๊น์ง ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์์ต๋๋ค.
- 3์ด ์์ ์ โฉ3์ 1์ด๋ค์ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๋๋ค. ๋ฐ๋ผ์ 1์ด๊ฐ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์ ๊ฒ์ผ๋ก ๋ด ๋๋ค.
- 4์ด ์์ ์ โฉ2์ 1์ด๊ฐ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์์ต๋๋ค.
- 5์ด ์์ ์ โฉ3์ 0์ด๊ฐ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง์ง ์์์ต๋๋ค.
์์
- ์ฃผ๊ฐ๊ฐ ์ ์ง๋๊ฑฐ๋ ์ฆ๊ฐํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์คํ์ pushํ๋ค. ๋ชจ๋ ธํ ๋ ์คํ(๊ฐ์ํ๋ ์คํ)์ (์ธ๋ฑ์ค)๋ฅผ ์ ์ฅํด์ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๋ ์๊ฐ ์คํ์์ ๊ฐ์ ๊บผ๋ด๋ฉฐ๊ฒฝ๊ณผ ์๊ฐ์ ๊ณ์ฐํ๋ค.
- ํ์ฌ ์ธ๋ฑ์ค - ์คํ์์ popํ ์ธ๋ฑ์ค = ๊ฐ๊ฒฉ์ด ์ ์ง๋ ๊ธฐ๊ฐ
- ๋ชจ๋ ๊ฐ๊ฒฉ์ ์ํํ ํ, ์คํ์ ๋จ์ ์๋ ๊ฐ ์ฒ๋ฆฌ
- ๋๊น์ง ๋จ์ด์ง์ง ์์ ๊ฐ๊ฒฉ๋ค์ ๋ฐฐ์ด์ ๋๊น์ง ์ ์ง๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
- ์๊ฐ๋ณต์ก๋: O(N) (๊ฐ ์์๊ฐ ์ต๋ 1๋ฒ push, 1๋ฒ pop๋จ)
์์ค ์ฝ๋
package algo03.StackAndQueue;
public class stack_stockPrices {
public static void main(String[] args) {
// ํ๋ก๊ทธ๋๋จธ์ค ์ฃผ์๊ฐ๊ฒฉ ๋ฌธ์
int[] prices1 = {1, 2, 3, 2, 3};
int[] result1 = solution(prices1);
System.out.print("Test 1: ");
for (int i : result1) {
System.out.print(i + " ");
}
// 4 3 1 1 0 (๊ฐ๊ฐ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ)
System.out.println();
int[] prices2 = {5, 3, 6, 7, 4};
int[] result2 = solution(prices2);
System.out.print("Test 2: ");
for (int i : result2) {
System.out.print(i + " "); // 1 1 2 1 0 (๊ฐ๊ฐ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ)
}
}
// prices ๋ฐฐ์ด์ ๋ํด, ๊ฐ ์ฃผ์ ๊ฐ๊ฒฉ์ด ์ธ์ ๋จ์ด์ง๋์ง ๊ตฌํ๋ ๋ฌธ์
public static int[] solution(int[] prices) {
int[] answer = new int[prices.length]; // ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฐฐ์ด
// ์ฃผ์ ๊ฐ๊ฒฉ ๋ฐฐ์ด์ ์ํ
for (int i = 0; i < prices.length; i++) {
// ๊ฐ ์ฃผ์ ๊ฐ๊ฒฉ์ ๋ํด ์ดํ ๊ฐ๊ฒฉ์ ์ํ
for (int j = i + 1; j < prices.length; j++) {
answer[i]++; // ์ฃผ์ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง ๋๊น์ง ์๊ฐ ์ฆ๊ฐ
// ๋ง์ฝ ํ์ฌ ๊ฐ๊ฒฉ์ด ์ดํ ๊ฐ๊ฒฉ๋ณด๋ค ํฌ๋ค๋ฉด, ์ฃผ์ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ณต ์ข
๋ฃ
if (prices[i] > prices[j]) {
break;
}
}
}
return answer; // ๊ฒฐ๊ณผ ๋ฐฐ์ด ๋ฐํ
}
}
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ฃผ์๊ฐ๊ฒฉ (์คํ/ํ)
๐ 1. ๋ฌธ์ ์ค๋ช ๐ก 2. ์ ๊ทผ๋ฐฉ์์ด์คfor๋ฌธํ์ฌ ์ธ๋ฑ์ค์ ์๋ ์์๊ณผ ์ดํ ๋ชจ๋ ๊ฐ์ ๋น๊ตํ๋ฉด์ ํ์ฌ ์์๊ฐ ๋น๊ตํ๊ณ ์๋ ์์๋ณด๋ค ์ปค์ง๋ฉด break;๋ฅผ ๊ฑธ์ด์ค๋ค.๊ทธ ์ ๊น์ง๋ answer[i]++์ ํด ์ค๋ค.
awesomepossum.tistory.com
์์ 7 - ์ฌ๋ฐ๋ฅธ ๊ดํธ (validParentheses.java)
๊ดํธ๊ฐ ๋ฐ๋ฅด๊ฒ ์ง์ง์ด์ก๋ค๋ ๊ฒ์ '(' ๋ฌธ์๋ก ์ด๋ ธ์ผ๋ฉด ๋ฐ๋์ ์ง์ง์ด์ ')' ๋ฌธ์๋ก ๋ซํ์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
์๋ฅผ ๋ค์ด "()()" ๋๋ "(())()" ๋ ์ฌ๋ฐ๋ฅธ ๊ดํธ์ ๋๋ค.
")()(" ๋๋ "(()(" ๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ์ ๋๋ค.
'(' ๋๋ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด s๊ฐ ์ฃผ์ด์ก์ ๋,
๋ฌธ์์ด s๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ์ด๋ฉด true๋ฅผ return ํ๊ณ ,
์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ์ด๋ฉด false๋ฅผ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ ํ ์กฐ๊ฑด
- ๋ฌธ์์ด s์ ๊ธธ์ด : 100,000 ์ดํ์ ์์ฐ์
- ๋ฌธ์์ด s๋ '(' ๋๋ ')' ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
s | answer |
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
์์
- ๊ดํธ๊ฐ ์ด๋ฆด ๋๋ง๋ค ์คํ์ ๋ฃ๊ณ , ๋ซํ ๊ดํธ๊ฐ ๋์ค๋ฉด ์คํ์ ์ต์๋จ ์์๋ฅผ ๊บผ๋ด ์ง์ด ๋ง๋์ง ํ์ธํ๋ฉฐ, ๋ชจ๋ ๊ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ง์ด์ก๋์ง ๊ฒ์ฌํ๋ ๋ฐฉ์์ผ๋ก ํ์ดํ๋ค.
์์ค ์ฝ๋
package algo03.StackAndQueue;
import java.util.Stack;
public class stack_validParentheses {
public static void main(String[] args) {
// ํ๋ก๊ทธ๋๋จธ์ค ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์
stack_validParentheses solution = new stack_validParentheses();
// ํ
์คํธ ์ฝ๋
System.out.println(solution.solution("()()")); // true
System.out.println(solution.solution("(()")); // false
System.out.println(solution.solution("())")); // false
System.out.println(solution.solution("(())()"));// true
System.out.println(solution.solution("")); // true
}
// ๊ดํธ์ ์ง์ด ๋ง๋์ง ํ์ธํ๋ ํจ์
boolean solution(String s) {
// ์ด๋ฆฐ ๊ดํธ๋ฅผ ์ถ์ ํ ์คํ ์์ฑ
Stack<Character> cnt = new Stack<>();
// ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ๋ํด ๋ฐ๋ณต
for (int i = 0; i < s.length(); i++) {
// ์ด๋ฆฐ ๊ดํธ '('๋ฅผ ๋ง๋๋ฉด ์คํ์ ํธ์
if (s.charAt(i) == '(') {
cnt.push('(');
}
// ๋ซํ ๊ดํธ ')'๋ฅผ ๋ง๋๋ฉด
else if (s.charAt(i) == ')') {
// ์คํ์ด ๋น์ด์์ผ๋ฉด ์ง์ด ๋ง์ง ์์ผ๋ฏ๋ก false ๋ฐํ
if (cnt.isEmpty()) {
return false;
}
// ์คํ์์ ์ด๋ฆฐ ๊ดํธ '('๋ฅผ pop
cnt.pop();
}
}
// ์คํ์ด ๋น์ด์์ผ๋ฉด ๋ชจ๋ ๊ดํธ๊ฐ ์ง์ ๋ง์ถ ๊ฒ์ด๋ฏ๋ก true ๋ฐํ, ์๋๋ฉด false
return cnt.isEmpty();
}
}
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์ ํ์ด (์คํ/ํ)
1. ๋ฌธ์ ์ค๋ช 2. ์ ๊ทผ๋ฐฉ์1) ์คํ์ ์ฌ์ฉํ์ง ์๊ณ ํ๊ธฐ๋ฌธ์์ด์ ์ํํ๋ฉฐ ๋ซํ ๊ดํธ์ ์ด๋ฆฐ ๊ดํธ์ ๊ฐฏ์๋ฅผ ๋ณ์์ ์ ์ฅํ๊ณ ๊ฐ์๊ฐ ๊ฐ์ผ๋ฉด true, ํ๋ฆฌ๋ฉด false ๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ 2) ์คํ์ ์ฌ์ฉํ์ฌ
awesomepossum.tistory.com
์คํ ์์ ๋ฅผ ํ์ด๋ณธ ํ
์คํ ๊ด๋ จ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ฅผ ํ๋ฉด์, ๋จ์ํ ์๋ฃ๊ตฌ์กฐ์ง๋ง ๋ฌธ์ ์ ํ์ด ๋ค์ํ๊ณ ํ์ฉ ๋ฒ์๊ฐ ๋๋ค๋ ์ ์ด ํฅ๋ฏธ๋ก์ ๋ค. ํนํ ๊ดํธ ๊ฒ์ฌ, ์ต์๊ฐ ์ ์ง, ํ์คํ ๊ทธ๋จ ์ต๋ ์ง์ฌ๊ฐํ, ์ฃผ์ ๊ฐ๊ฒฉ ๋ฌธ์ ๋ฑ์์ ๋ชจ๋ ธํ ๋ ์คํ์ด๋ ๋ณด์กฐ ์คํ์ ํ์ฉํ๋ ๋ฐฉ์์ด ์ธ์์ ์ด์๋ค. ๋ํ, ์คํ๊ณผ ๋ฐ๋๋๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํ(Queue) ๋ ํจ๊ป ๊ณต๋ถํ๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ํญ์ด ๋์ด์ง ๊ฒ ๊ฐ๋ค๊ณ ๋๊ผ๋ค.
์คํ์๋ ๋ชจ๋ ธํ ๋ ์คํ๊ณผ ๋ณด์กฐ์คํ์ด ์๋ค.
๋ชจ๋ ธํ ๋ ์คํ(Monotonic Stack)์ ๊ฐ์ด ์ ๋ ฌ๋ ์ํ, ์ฆ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์ ํํ๋ฅผ ์ ์งํ๋ ์คํ์ด๋ค. ์ด ๊ตฌ์กฐ๋ ์ฃผ์ ๊ฐ๊ฒฉ ๋ฌธ์ , ํ์คํ ๊ทธ๋จ ์ต๋ ์ง์ฌ๊ฐํ ๋ฌธ์ , ๋ค์ ํฐ ์ ์ฐพ๊ธฐ ๋ฌธ์ ์ ๊ฐ์ ๋ฌธ์ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ์ ๊ฐ๊ฒฉ ๋ฌธ์ ์์๋ ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๋ ์๊ฐ๊น์ง ์ธ๋ฑ์ค๋ฅผ ์คํ์ ์ ์ฅํ์ฌ ์ ์ง ๊ธฐ๊ฐ์ ๊ณ์ฐํ๊ฑฐ๋, ํ์คํ ๊ทธ๋จ ๋ฌธ์ ์์๋ ๋์ด๊ฐ ๋ฎ์์ง๋ ์๊ฐ ๋์ด๋ฅผ ๊ณ์ฐํ๋ค. ์ด์ฒ๋ผ ๋ชจ๋ ธํ ๋ ์คํ์ ๊ฐ์ ๋น๊ตํ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์๊ฐ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉฐ, ํน์ ํจํด์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๋ ๋ฐ ๋์์ ์ค๋ค.
๋ฐ๋๋ก ์ต์๊ฐ, ์ต๋๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์์๋ ๋ณด์กฐ์คํ(Auxiliary Stack)์ ์ฌ์ฉํ๋ค. ๋ณด์กฐ์คํ์ ๊ธฐ์กด ์คํ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ํน์ ๊ฐ์ ์ถ์ ํ๋ ๋ฐ ์ฐ์ธ๋ค. ์ฃผ๋ก ์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ ์ถ์ ํ ๋ ํ์ฉ๋๋ฉฐ, ์ต์๊ฐ์ ์ ์ฅํ๋ ๋ณด์กฐ ์คํ์ ์ ์งํ๋ฉด pop ์ฐ์ฐ์ ํ ๋๋ O(1) ์๊ฐ ์์ ์ต์๊ฐ์ ๊ตฌํ ์ ์๋ค. ์ด ๋ฐฉ์์ ์คํ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ด๋ ์์ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐธ์กฐํ ์ ์๊ฒ ํด ์ฃผ๋ฉฐ, ์คํ ์ฐ์ฐ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋๋ค. ๋ณด์กฐ ์คํ์ ๊ธฐ์กด ์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ฉด์ ํน์ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ์ ์ฅํ๊ณ ๋น ๋ฅด๊ฒ ๋ฐํํ ์ ์๋๋ก ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
์คํ ๋ฌธ์ ๋ค์ ๋์ฒด๋ก ์ฌ์ด ํธ์ ์ํ๋ค๊ณ ์๊ฐ ๋์๊ณ , ์คํ์ ๊ตฌํํ๋ ๋ฐฉ์์๋ ๋ฐฐ์ด๋ก ๊ตฌํํ๋ ๊ฒ๊ณผ linked list๋ก ๊ตฌํํ๋ ๊ฒ์ด ์๋๋ฐ ๋ฐฐ์ด๋ก ๊ตฌํํ๋ ๋ฌธ์ ๋ง ๋์ค๋ ํธ์ด๋ค.
GitHub: https://github.com/awesomepossumgirl/Algorithm/tree/main/src/algo03/StackAndQueue
๋ฌธ์ ์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค https://school.programmers.co.kr/learn/courses/30/parts/12081
[์๋ฃ๊ตฌ์กฐ] ์คํ์ ๋ํด์ ์ ๋ฆฌ๊ฐ ์ ๋ ๋ธ๋ก๊ทธ๋ค
โ ์คํ ์ผ๋ฐ
[์๋ฃ๊ตฌ์กฐ] | ์คํ(Stack)
์คํ์ด๋? > ์คํ์ ํ์ชฝ ๋์์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ ์ ํ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ํ์ ์ ์ถ(Last-In-First-Out) ํํ์ ์ ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค๋ ๋ด๋ถ์์ ์ต์์ ํ์ ๋ฐฐ์ด์ธ
velog.io
[์๋ฃ๊ตฌ์กฐ] ์คํ(Stack)๊ณผ ํ(Queue)์ ๋ํด์ ์์๋ณด์!
๐ ์คํ(Stack)์ด๋ ๋ฌด์์ผ๊น? ์คํ(Stack)์ "์๋ค"๋ผ๋ ์๋ฏธ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ์์ ์ฌ๋ฆฐ ํํ์ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์กฐ๊ธ ๋ ์ค๋ช ํ์๋ฉด, ์์ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ์์๋๋ก ์์ด๋ฉฐ ๊ฐ์ฅ ๋ง์ง
jud00.tistory.com
โ ์คํ๊ณผ ์ฌ๊ทํธ์ถ (ํ์ด์ฌ)
1-4. [์๋ฃ๊ตฌ์กฐ์ด๋ก ] ์คํ(Stack)
ํ์ชฝ ๋์์ ์๋ฃ๋ฅผ ๋ฃ๊ฑฐ๋ ๋บผ ์ ์๋, ๋ฐ์ดํฐ๋ฅผ ์ ํ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๊ตฌ์กฐ์คํ(Stack)์ ์ปดํจํฐ ๊ณผํ์์ ๋งค์ฐ ์ค์ํ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ค. ์คํ์ ํญ๋ชฉ๋ค์ด ์์ฌ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ปํ๋ฉฐ, LIFO
velog.io
โ ์ด๊ฑด ์๋ฃ๋ฅผ ์กฐ์ฌํ๋ค๊ฐ ํฅ๋ฏธ๋ก์ด ๋ด์ฉ์ด๋ผ์ ๊ฐ์ ธ์๋ค.
์๋ฐ์ Stack ํด๋์ค๋ ์ ์ฌ์ฉํ์ง ์๋ ๊ฑธ๊น?
๊ธฐ๋ณธ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์คํ์ด์ง๋ง, ์๋ฐ์ Stack ํด๋์ค๋ ๊ทธ๋ ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค. Stack ํด๋์ค์๊ฒ ์ด๋ค ์ฌ์ฐ์ด ์๋์ง ์์๋ณด์.
velog.io
โ ๋ฐฐ์ด(Array)๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ(LinkedList)๋ฅผ ์ด์ฉํ ์คํ ๊ตฌํ ๋น๊ต
[์๋ฃ๊ตฌ์กฐ] ์คํ(Stack) ์๋ฃ๊ตฌ์กฐ ์์๋ณด๊ธฐ & Java ์์ ์ฝ๋
์ค๋์ ์๋ฃ๊ตฌ์กฐ ์ค Stack์ ๋ํด ์ ๋ฆฌํด๋ดค๋ค. ์คํ(Stack)์ด๋? ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก ํ์ ์ ์ถ(Last-In-First-Out, LIFO) ์์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ถ์ ์๋ฃํ์ด๋ค. ์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปจํ
hoehen-flug.tistory.com
โ ์คํ(Stack) VS ํ(Queue) VS ๋ฑ(Deque)
[์๋ฃ๊ตฌ์กฐ] ์คํ (STACK), ํ(QUEUE) ๊ฐ๋ /๋น๊ต /ํ์ฉ ์์
[์๋ฃ๊ตฌ์กฐ] ์คํ (STACK), ํ(QUEUE) ๊ฐ๋ /๋น๊ต /ํ์ฉ ์์/ ์ค์ํ ํ์ฉ ์คํ (STACK)์ด๋? ๐ ์คํ์ ๊ฐ๋ ์คํ(stack)์ด๋ ์์ ์ฌ๋ฆฐ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์คํ ์๋ฃ๊ตฌ์กฐ๋ผ๋ ๊ฒ์ ์ฑ ์ ์๋ ๊ฒ
devuna.tistory.com
[์๋ฃ๊ตฌ์กฐ] 2. ์คํ(Stack)๊ณผ ํ(Queue), ๋ฑ(Deque)
์คํ๊ณผ ํ, ๋ฑ ์ค๋์ ์ ํ ์๋ฃ๊ตฌ์กฐ์ ํด๋นํ๋ ์๋ฃ๊ตฌ์กฐ ์ค ๋ํ์ ์ธ ์คํ, ํ, ๋ฑ 3๊ฐ์ง์ ์๋ฃ๊ตฌ์กฐ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
velog.io
'Stack vs Queue' & 'LIFO(ํ์ ์ ์ถ) vs FIFO(์ ์ ์ ์ถ)'
'Stack vs Queue' & 'LIFO(ํ์ ์ ์ถ) vs FIFO(์ ์ ์ ์ถ)'
velog.io