
1. ์คํ(Stack)์ด๋?
- ์คํ์ LIFO (Last In First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค. (ํ๋ง๊ธ์ค..)
- ๋ง์ง๋ง์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ค.
์์: ์ ์๋ฅผ ์๋ ๊ฒ๊ณผ ๋น์ทํ๋ค. ์ ์ ์๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋งจ ์์ ๋์ด๊ณ , ์ ์๋ฅผ ๊บผ๋ผ ๋๋ ๋งจ ์์์๋ถํฐ ๊บผ๋ธ๋ค.
2. ์คํ์ ์ฃผ์ ์ฐ์ฐ
1. push():
- ๋ฐ์ดํฐ๋ฅผ ์คํ์ ๋งจ ์์ ์ถ๊ฐํ๋ค.
์: stack.push(1) → ์คํ์ 1 ์ถ๊ฐ.
2. pop():
- ์คํ์ ๋งจ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํ๋ค.
- ์คํ์ด ๋น์ด ์์ ๊ฒฝ์ฐ, EmptyStackException์ ๋ฐ์์ํจ๋ค.
3. peek():
- ์คํ์ ๋งจ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ๋ฐํํ๋ค.
- ์คํ์ด ๋น์ด ์์ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
4. isEmpty():
- ์คํ์ด ๋น์ด ์๋์ง ํ์ธํ๋ค.
- ๋น์ด ์์ผ๋ฉด true, ๋น์ด ์์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
5. size():
- ์คํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
6. contains(Object o):
- ํน์ ๊ฐ์ด ์คํ์ ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค.
- ํฌํจ๋์ด ์์ผ๋ฉด true, ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
import java.util.Stack;
public class StackFundamental {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 1. ์์ ์ถ๊ฐ
stack.push(1);
stack.push(2);
stack.push(3);
// 2. ์คํ ์ํ ํ์ธ
System.out.println(stack); // [1, 2, 3]
// 3. ๋งจ ์ ์์ ํ์ธ
System.out.println("์ ์ผ ๊ผญ๋๊ธฐ์ ๊ฐ : " + stack.peek()); // 3
// 4. ์์ ์ ๊ฑฐ
System.out.println("๊บผ๋ธ ๊ฐ : " + stack.pop()); // 3
// 5. ์คํ์ด ๋น์ด์๋์ง ํ์ธ
System.out.println("์คํ์ด ๋น์๋๊ฐ? " + stack.isEmpty()); // false
// 6. ์คํ ํฌ๊ธฐ ํ์ธ
System.out.println("์คํ์ ์ ์ฅ ๋ ์์ ์ : " + stack.size()); // 2
// 7. ํน์ ์์ ํฌํจ ์ฌ๋ถ ํ์ธ
System.out.println("์คํ์ 1 ์ด ์๋๊ฐ? " + stack.contains(1)); // true
}
}
3.์คํ์ ๋์ ์ดํด
3.1 ์์ ์ถ๊ฐ๋ ํญ์ ์คํ์ ๋งจ ์์ ์ด๋ฃจ์ด์ง๋ค.
3.2. ์์ ์ ๊ฑฐ๋ ํญ์ ์คํ์ ๋งจ ์์์ ์ด๋ฃจ์ด์ง๋ค.
3.3 ์คํ ์ํ:
• ์ฒ์: [1, 2, 3].
•pop() ์ดํ: [1, 2].
4. ์คํ์ ํ์ฉ ์
• ๊ดํธ ๊ฒ์ฌ: ์ด๊ณ ๋ซ๋ ๊ดํธ์ ์ง์ด ๋ง๋์ง ํ์ธํ ๋ ์ฌ์ฉ.
• DFS (๊น์ด ์ฐ์ ํ์): ๊ทธ๋ํ ํ์์์ ํธ์ถ ์์๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ.
• Undo ๊ธฐ๋ฅ ๊ตฌํ: ์์ ๊ธฐ๋ก์ ์ ์ฅํ์ฌ ์ด์ ์ํ๋ก ๋ณต๊ตฌํ ๋ ์ฌ์ฉ.
์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํ๊ฑฐ๋, ์์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฌธ์ ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
๊ณผ์ 1. ์๋ฒฝํ ๊ดํธ
- Stack ์ ํ์ฉํ์ฌ ๊ดํธ์ ์ด๊ณ ๋ซํ์ด ์๋ฒฝํ ๊ดํธ์ธ ๊ฒฝ์ฐ true, ์๋ ๊ฒฝ์ฐ false ๋ฅผ ๋ฐํํ๋ solution ์ฝ๋๋ฅผ ์์ฑํ์ธ์
1. ๋ฌธ์ ๋ถ์
1.1 ๋ชฉํ : ์ฃผ์ด์ง ๋ฌธ์์ด์ด “์๋ฒฝํ ๊ดํธ”์ธ์ง ํ์ธํ๋ ํจ์ solution์ ์์ฑํ๋ค.
1.2 ์กฐ๊ฑด :
• ์ด๋ฆฐ ๊ดํธ (๋ ๋ซํ ๊ดํธ )์ ์ ํํ ์ง์ ์ด๋ฃจ์ด์ผ ํ๋ค.
• ๋ชจ๋ ๋ซํ ๊ดํธ๋ ์คํ์ ์ด๋ฆฐ ๊ดํธ๊ฐ ์์ ๋๋ง ์ง์ ์ด๋ฃฐ ์ ์๋ค.
• ๋ฌธ์์ด์ ๋ชจ๋ ํ์ธํ์ ๋ ์คํ์ด ๋น์ด ์์ด์ผ ์๋ฒฝํ ๊ดํธ์ด๋ค.
2. ํด๊ฒฐ ๋ฐฉ์
๊ดํธ์ ์ด๋ฆผ๊ณผ ๋ซํ์ ์์๋ฅผ ์ ์งํ๊ธฐ ์ํด LIFO๊ตฌ์กฐ๊ฐ ํ์ํ๋ฐ ์ด๋ฅผ ์ํด ์คํ์ ์ฌ์ฉํ๋ค.
์ด๋ฆฐ ๊ดํธ(๋ ์คํ์ ๋ฃ๊ณ , ๋ซํ ๊ดํธ๋ฅผ ๋ง๋ฌ์ ๋ ์คํ์์ ํ๋๋ฅผ ๊บผ๋ด์ ๋งค์นญํ๋ค.
3. ์๊ณ ๋ฆฌ์ฆ.
1) ๋ฌธ์์ด s๋ฅผ ์ํํ๋ฉด์ ๊ฐ ๋ฌธ์ c๋ฅผ ํ์ธํ๋ค.
2) ์ด๋ฆฐ ๊ดํธ์ธ ๊ฒฝ์ฐ์๋, ์คํ์ ๋ฃ๋๋ค.
3) ๋ซํ ๊ดํธ์ธ ๊ฒฝ์ฐ์๋, ์คํ์ด ๋น์ด ์๋ค๋ฉด ๋ซํ ๊ดํธ์ ๋งค์นญ๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ์์ผ๋ฏ๋ก false๋ฅผ ๋ฐํํ๋ค.
์คํ์ด ๋น์ด์์ง ์๋ค๋ฉด ์คํ์์ ์ด๋ฆฐ ๊ดํธ๋ฅผ ํ๋๋ฅผ ๊บผ๋ธ๋ค.
4) ๋ฌธ์์ด ์ํ๊ฐ ๋๋ ํ:
์คํ์ด ๋น์ด ์๋ค๋ฉด ์๋ฒฝํ ๊ดํธ์ด๋ค. - true ๋ฐํ
์คํ์ด ๋น์ด ์์ง ์๋ค๋ฉด ์๋ฒฝํ์ง ์๋ค. - false ๋ฐํ
4. ๋ฌธ์ ๋ถ์
4.1 ์ด๋ฆฐ ๊ดํธ์ ๋ซํ ๊ดํธ์ ์ง์ ํ์ธ :
- ์ด๋ฆฐ ๊ดํธ๋ฅผ ๋ง๋ ๋๋ง๋ค ์คํ์ ์ ์ฅํ๋ค.
- ๋ซํ ๊ดํธ๋ฅผ ๋ง๋ ๋๋ง๋ค ์คํ์์ ์ด๋ฆฐ ๊ดํธ ํ๋๋ฅผ ์ ๊ฑฐ(pop)ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ซํ ๊ดํธ๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ์ด๋ฆฐ ๊ดํธ์ ๋งค์นญ๋๋ค.
4.2 ๋ซํ ๊ดํธ๊ฐ ์คํ์ด ๋น์์ ๋ ๋ฐ์ :
- ๋ซํ ๊ดํธ๊ฐ ์์ ๋ ์คํ์ด ๋น์ด ์์ผ๋ฉด ๋งค์นญ๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ์๋ค๋ ๋ป์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์ฆ์ false ๋ฐํ.
4.3 ๋ฌธ์์ด์ ๋ชจ๋ ํ์ธ ํ ์คํ ์ํ ํ์ธ :
- ๋ชจ๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ๋งค์นญ๋์๋ค๋ฉด ์คํ์ ๋น์ด ์์ด์ผ ํ๋ค.
- ์คํ์ด ๋น์ด ์์ง ์๋ค๋ฉด ๋งค์นญ๋์ง ์์ ์ด๋ฆฐ ๊ดํธ๊ฐ ๋จ์ ์๋ค๋ ๋ป์ผ๋ก false๋ฅผ ๋ฐํํ๋ค.
import java.util.Stack;
public class StackAssignment1 {
public static boolean solution(String s) {
Stack<Character> stack = new Stack<>();
// ์์ฌ(Pseudo) ์ฝ๋
// 1. ์ด๋ฆฐ ๊ดํธ ”(“ ๋ฅผ ๋ง๋๋ฉด? ์คํ์ ๋ฃ๋๋ค (push)
// 2. ๋ซํ ๊ดํธ๋ฅผ ”)” ๋ง๋๋ฉด? ์คํ์ ์๋ ์ ๋ฅผ ๋ฝ๋๋ค (pop)
// 3. ๋ฌธ์์ด์ด ๋๋ฌ์ด์
// ์คํ์ด ๋น์์ผ๋ฉด? -> ์๋ฒฝํ ๊ดํธ -> True
// ์คํ์ด ์๋น์์ผ๋ฉด? -> False
// 4. ๋ฌธ์์ด์ด ์๋๋ฌ์ด์
// ์คํ์ด ๋น์์ผ๋ฉด? -> False
for (char c : s.toCharArray()) {
if (c == '(') {
// ์ด๋ฆฐ ๊ดํธ๋ ์คํ์ ์ถ๊ฐ
stack.push(c);
} else if (c == ')') {
// ๋ซํ ๊ดํธ๋ฅผ ๋ง๋ฌ์ ๋
if (stack.isEmpty()) {
// ๋งค์นญ๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ์์ผ๋ฉด false
return false;
}
stack.pop(); // ๋งค์นญ๋๋ ์ด๋ฆฐ ๊ดํธ ์ ๊ฑฐ
}
}
// ๋ชจ๋ ๋ฌธ์์ด ์ํํ ์คํ์ด ๋น์ด ์์ผ๋ฉด true, ์๋๋ฉด false
return stack.isEmpty();
}
public static void main(String[] args) {
String tc1 = "()()"; // true
String tc2 = "()()("; // false
String tc3 = "())"; // false
String tc4 = "((((((()))()()))))()()())(())))"; // false
System.out.println(solution(tc1));
System.out.println(solution(tc2));
System.out.println(solution(tc3));
System.out.println(solution(tc4));
}
}