๐ ๋ฌธ์ ์ค๋ช
- ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด(Valid Parenthesis String, VPS) ์ธ์ง ํ๋ณํ๋ ๋ฌธ์
-
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด(VPS) ์ด๋ฉด โYESโ ์ถ๋ ฅ, ์๋๋ผ๋ฉด โNOโ๋ฅผ ์ถ๋ ฅํ๋ค. (ํ ์ค์ ํ๋์ฉ)
- ๊ดํธ ๋ฌธ์์ด(Parenthesis String, PS)์ด๋?
- ๋๊ฐ์ ๊ดํธ ๊ธฐํธ
'('
์')'
๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด๋ฉด ๋ชจ๋ OK
- ๋๊ฐ์ ๊ดํธ ๊ธฐํธ
- ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด(Valid Parenthesis String, VPS)์ด๋?
- ๋๊ฐ์ ๊ดํธ ๊ธฐํธ
'('
์')'
์ผ๋ก ์ด๋ฃจ์ด์ก์ ๋ฟ๋ง ์๋๋ผ, ๊ดํธ์ ๋ชจ์์ด ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋- ๊ดํธ์ ์ง์ด ์ ํํ ๋ง๋ ๋ฌธ์์ด์ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด(VPS)์ด๋ผ๊ณ ํ๋ค. - ํ์์ ๊ดํธ ๊ธฐํธ๋ก ๋
"( )"
๋ฌธ์์ด์ ๊ธฐ๋ณธ VPS ์ด๋ผ๊ณ ํ๋ค. - ๋ง์ผ x๊ฐ VPS๋ผ๋ฉด, x๋ฅผ ํ๋์ ๊ดํธ ์(๊ธฐ๋ณธ VPS)์ ๋ฃ์ ๋ฌธ์์ด
"(x)"
๋ VPS๊ฐ ๋๋ค. - ๋ง์ผ x, y๊ฐ VPS๋ผ๋ฉด
"xy"
๋ VPS๊ฐ ๋๋ค.
- ๋๊ฐ์ ๊ดํธ ๊ธฐํธ
๐ก ์์ด๋์ด
- ์คํ์ ๊ตฌํํ๊ธฐ ์ํด ๋ ์ง๋ณด๋ ์๋ฃ๊ตฌ์กฐ์ธ Deque๋ฅผ ์ฌ์ฉํ๋ค.
'('
๊ฐ ๋์ค๋ฉด ์คํ์ ๋ฃ๋๋ค. (์๋๋ค)')'
๊ฐ ๋์ค๋ฉด ์คํ์์ โ(โ๋ฅผ ํ๋ ๊บผ๋ด๊ณ , ์ญ์ ํ๋ค.- ๊บผ๋ผ ๊ฒ ์์ผ๋ฉด VPS
- ๊บผ๋ผ ๊ฒ ์์ผ๋ฉด ๋จ์ PS
- ์ฌ๋ ๊ดํธ๋ ๋จ์ push๋ก ์คํ ๋ด๋ถ์ ์ฝ์ ํ๊ณ , ์คํ ๋ด๋ถ์ ์ฝ์ ๋๊ณ ์ฝ์ ๋ ๋ฌธ์์ด์ด ์ฌ๋ ๊ดํธ ๋ฐ์ ์์ผ๋ฏ๋ก ๋ซ๋ ๊ดํธ ๋ํ ์คํ ์ต ์๋จ์ ๋ฌธ์์ด์ ๋จ์ popํ๋ค.
๐ ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
String input = br.readLine();
Deque<Character> stack = new ArrayDeque<>();
boolean isVPS = true;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '(') {
stack.push(c);
} else {
if (stack.isEmpty()) {
isVPS = false;
break;
}
stack.pop();
}
}
System.out.println((isVPS && stack.isEmpty()) ? "YES" : "NO");
}
}
}
โฑ ์๊ฐ๋ณต์ก๋
O(T): ํ์ง๋ง ๋ฌธ์์ด ๊ธธ์ด๊ฐ ์ต๋ 50์ด๋ฏ๋ก ์ฌ์ค์ ์์ ์๊ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
โ๏ธ ๋๋ ์
- ์ฒ์ ํ๋๋ ๊ดํธ ์ง๋ง์ถ๊ธฐ์๋ง ์ง์คํด์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ์ด์ ํ๋ ธ๋ค.
- ๋ซ๋ ๊ดํธ ๋ฌธ์์ด์ ์ฌ๋ ๊ดํธ ๋ฌธ์์ด ์ ๋ณ ์กฐ๊ฑด ๊ฐ์๊ฒ๋ ๊ณ ๋ฏผํ๋ค.
- ์คํ ๊ตฌ์กฐ๊ฐ ์ ํฉํ๋ค๋๊ฑธ ๊ธ๋ฐฉ ๊นจ๋ฌ์๊ณ , ๋ฌธ์ ๋ฅผ ๋ ํ๋ฉด ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ธ๋ฐฉ ํ ์ ์๊ฒ ์ง.