[SWEA 1218] [S/W 문제해결 기본] 4일차 - 괄호 짝짓기
업데이트:
문제
- SWEA 1218
- 문제의 저작권은 SW Expert Academy에 있습니다.
접근방식
문자열을 입력받아 스택에 하나씩 넣어주는데 이때 열린 괄호이면 넣어주고, 닫힌 괄호일 경우에는 스택에 넣지 말고 스택의 맨 위에 있는 열린 괄호를 pop()해서 닫힌 괄호와 일치한 괄호인지를 판단한다. 이렇게 해서 모든 짝이 맞는 경우 1을 반환하고 그렇지 않으면 0을 반환하면 된다. 스택을 이용하면 쉽게 풀리는 문제이다.
코드
import java.util.Scanner;
import java.util.Stack;
public class Swea_1218 {
static int T, N;
static char[] inputs;
static Stack<Character> stack;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 0; tc < 10; tc++) {
N = sc.nextInt();
String str = sc.next();
inputs = new char[N];
for (int i = 0; i < N; i++) {
inputs[i] = str.charAt(i);
}
// input에서 하나씩 꺼내서 stack에 넣기
stack = new Stack();
int i = 0;
int Answer = 0;
boolean flag = true;
while (flag) {
// 닫힌 기호라면
if(i == N-1) break;
if (inputs[i] == ')' || inputs[i] == ']' || inputs[i] == '}' || inputs[i] == '>') {
char close = inputs[i]; // 닫아주는 괄호
char popNum = stack.pop(); // 열린 괄호
// 닫아주는 괄호가 스택에서 꺼낸 열린 괄호와 같은지 확인
switch (close) {
case ')':
if (popNum == '(') {
Answer = 1;
} else {
Answer = 0;
flag = false;
}
break;
case ']':
if (popNum == '[') {
Answer = 1;
}
else {
Answer = 0;
flag = false;
}
break;
case '}':
if (popNum == '{'){
Answer = 1;
}
else {
Answer = 0;
flag = false;
}
break;
case '>':
if (popNum == '<'){
Answer = 1;
}
else {
Answer = 0;
flag = false;
}
break;
}
} else
stack.push(inputs[i]);
i++;
}
System.out.println("#"+(tc+1)+" "+Answer);
}
}
}