
https://leetcode.com/problems/valid-parentheses/description/
'(', ')', '{', '}', '[' ,']'์ ๋ฌธ์๊ฐ ํฌํจ๋ ๋ฌธ์์ด s๊ฐ ์ฃผ์ด์ก์ ๋, ์
๋ ฅ ๋ฌธ์์ด์ด ์ ํจํ์ง ๊ฒ์ฌํ๋ผ.
๋ฌธ์์ด์ด ์ ํจํ๊ธฐ ์ํด์๋:
1. ์ด๋ฆฐ ๊ดํธ๋ค์ ๊ฐ์ ํ์
์ ๊ดํธ๋ค๋ก ๋ซํ์ผ ํ๋ค.
2. ์ด๋ฆฐ ๊ดํธ๋ค์ ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ซํ์ผ ํ๋ค.
3. ๋ชจ๋ ๋ซํ ๊ดํธ๋ ์ผ์นํ๋ ์ด๋ฆฐ ๊ดํธ ํ์
์ด ์๋ค.
๐ง์ ์ฝ ์กฐ๊ฑด
1 <= s.length <= 10^4
=> ์๊ฐ๋ณต์ก๋ O(N^2)์ ๋์ง ๋ง๋ผ๋ ์๋ฏธ
2. ๋ฌธ์์ด s๋ ์ค์ง '()[]{}'๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๋ฌธ์์ด s๋ฅผ for๋ฌธ์ผ๋ก ์ํํ๋๋ฐ:
if ์ด๋ฆฐ ๊ดํธ: stack.push()
else ๋ซํ ๊ดํธ: stack.peek()๋ก top ์์๋ฅผ ํ์ธํ ํ, ๋งค์นญ๋๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ์์ผ๋ฉด stack.pop()
์ฐ์ ๋ด๊ฐ ๊ธฐ์กด์ ์๊ฐํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค:
1. ๊ดํธ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ์ ์ถ๊ฐ
2. (์คํ์ ์์ ๋ง์ถ๊ธฐ ์ํด)์คํ์ ํฌ๊ธฐ๊ฐ 2 ์ด์์ด๋ฉด:
ํ์ฌ์ ๋ฌธ์๊ฐ ๋ซํ ๊ดํธ๊ณ ์คํ์ top - 1 ์์๊ฐ ๋งค์นญ๋๋ ์ด๋ฆฐ ๊ดํธ๋ฉด
3. ์คํ์ 2๋ฒ ์ญ์
4. ์คํ์ด ๋น์ด์์ผ๋ฉด true๋ฅผ, ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฆฌํด
public class ValidSolution {
public boolean isValid(String s) {
List<Character> stack = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
stack.add(c); // ๋ซํ ๊ดํธ๋ง ์ฃผ์ด์ง ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ๋ฃ์ด์ค์ผ๋จ
// ๋น stack์ pop()ํ์ง ์๊ธฐ ์ํด if ์กฐ๊ฑด ๊ฑธ์ด๋
// stack.get(stack.lastIndexOf(c) - 1): stack(top - 1)์ ์์๋ฅผ ๊ฐ์ ธ์ด
if (stack.size() > 1) {
if (c == ')' && stack.get(stack.lastIndexOf(c) - 1) == '(') {
stack.removeLast();
stack.removeLast();
} else if (c == '}' && stack.get(stack.lastIndexOf(c) - 1) == '{') {
stack.removeLast();
stack.removeLast();
} else if (c == ']' && stack.get(stack.lastIndexOf(c) - 1) == '[') {
stack.removeLast();
stack.removeLast();
}
}
}
return stack.isEmpty() ? true : false;
}
}
๐ฉ๊ดํธ๋ฅผ ๊ฒ์ฌํ๋ ๋ถ๋ถ์ด ํ๋์ฝ๋ฉ๋์ด ์์ด์ ๋ง์ฝ์ ๊ดํธ ์ข
๋ฅ๊ฐ ๋ ๋ง์ผ๋ฉด ์ ํฉํ ํ์ด๋ ์๋!
๐คฆโโ๏ธsubmit์๋ ์ฑ๊ณตํ๋๋ฐ, ๋ฆฌ์คํธ๋ฅผ stack์ฒ๋ผ ์ฌ์ฉํ๊ณ ์์ด์ ์ง๊ด์ ์ธ ํ์ด๋ ์๋๋ค. ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๊น?
๐ํ์ด์ฌ์์ stack = []์ ๊ฐ์ด ๋ฆฌ์คํธ๋ก ์ฌ์ฉํ๋ผ๊ณ ํด์, ์๋ฐ๋ ๋๊ฐ์ด ArrayList๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.
๊ทธ๋ฌ๋, ์๋ฐ์๋ Stack์ด๋ผ๋ ์ปฌ๋ ์
ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ๋ค.
๐๋ค์ ํ๋ฒ ์๋์ ๊ตฌ์กฐ๋๋ฅผ ์๋ฏธํด๋ณด์.

๋ฐ๋ผ์, ์๋ฐ์ Stack ์๋ฃ๊ตฌ์กฐ์ ๋ฉ์๋๊ฐ ๋ฌด์์ด ์๋์ง ํ์ ํ ํ, ์์ ๋ ์ฝ๋ ์ค๊ณ๋ฅผ ๋ฐ๋ผ์ ์ฝ๋ ๊ตฌํ์ ๋ค์ ํด๋ณด์.
์ ์ธ์ Stack<T> stackName = new Stack<>();ํํ๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ํ์
์ ํด๋์ค ๋๋ ๋ํผ ํด๋์ค๋ก ๋ค์ด๊ฐ์ผ ํ๋ค.
push(T t): ๋ฐ์ดํฐ๋ฅผ ์คํ์ ์ถ๊ฐํ๊ณ , ํด๋น ์ธ์๋ฅผ ๋ฐํํ๋ค.add(): ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ๋ฅผ ์คํ์ ์ถ๊ฐํ์ง๋ง, ๋ฆฌ์คํธ ์ธํฐํ์ด์ค์ ์๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ boolean ๊ฐ์ ๋ฆฌํดํ๋ค.peek(): ์คํ์ ๋ง์ง๋ง ์์, ์ฆ top์ ์์๋ฅผ ๋ฐํํ๋ฉฐ, ์คํ์๋ ๋ณํ๋ฅผ ์ฃผ์ง ์๋๋ค.pop(): ์คํ์ ๋ง์ง๋ง ์์๋ฅผ ์ ๊ฑฐํจ๊ณผ ๋์์ ํด๋น ๊ฐ์ ๋ฐํempty(): ์คํ์ด ๋น์ด์๋์ง์ ์ฌ๋ถ๋ฅผ boolean์ผ๋ก ๋ฐํsearch(): ๋ฉ์๋์ ์ธ์๋ฅผ ์คํ์์ ๊ฒ์ํ์ฌ ํด๋น ์์น๋ฅผ ๋ฐํ๋ค์ ๋ฌธ์ ๋ก ๋์์์, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํด์ผํ ๋ฉ์๋๋ ๊ดํธ๋ฅผ ๋ฃ๊ธฐ ์ํ push(), top์ ์์๋ฅผ ํ์ธํ๊ธฐ ์ํ peek(), ๊ดํธ๊ฐ ๋งค์นญ๋๋ฉด ๊บผ๋ด์ผํ๋ pop(), ๊ทธ๋ฆฌ๊ณ ๋ซํ ๊ดํธ๋ ๋ฐ๋์ ๊ฐ์ ํ์
์ ์ด๋ฆฐ ๊ดํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ด ๋น์๋์ง ํ์ธํ๊ธฐ ์ํ empty()๋ก ์ด 4๊ฐ์ง๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
str.charAt(idx)๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ c๋ก ๋ณํํ๋ค.stack.push()stack.peek()๋ก top ์์๋ฅผ ํ์ธํ ํ, ๋งค์นญ๋๋ ์ด๋ฆฐ ๊ดํธ๊ฐ ์์ผ๋ฉด stack.pop()return stack.isEmpty()๋ก boolean๊ฐ ๋ฆฌํดpublic class ValidSolution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else if (stack.isEmpty()) {
return false; // ์ด๋ฆฐ ๊ดํธ๊ฐ ์คํ์ ์์ผ๋ฉด false
} else if ((c == ')' && stack.peek() == '(') || (c == '}' && stack.peek() == '{') || (c == ']' && stack.peek() == '[')) {
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
}
๐์ฐธ๊ณ ์๋ฃ
๐์๋ฐ stack ๋ฉ์๋ ์ข
๋ฅ: https://ittrue.tistory.com/200