문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD&categoryId=AV14eWb6AAkCFAYD&categoryType=CODE&problemTitle=1218&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Solution {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int problemNum = 1;
for (int i = 0; i < 10; i++) {
int length = Integer.parseInt(reader.readLine());
sb.append("#").append(problemNum++).append(" ");
sb.append(isPerfect(reader.readLine().toCharArray()) == true ? 1 : 0).append("\n");
}
System.out.println(sb);
}
private static boolean isPerfect(char[] chars) {
Stack<Character> stack = new Stack<>();
boolean result = true;
for (char c : chars) {
if (c == 40 || c == 60 || c == 91 || c == 123) {
stack.push(c);
} else {
if (!stack.isEmpty()) {
char target = stack.pop();
if (!(target + 1 == c ||target + 2 == c)) {
result = false;
break;
}
} else {
result = false;
break;
}
}
}
if (!stack.isEmpty()) result = false;
return result;
}
}
- 처음엔 문자열을 비교하는 방식으로 풀었으나, 구현이 복잡하고 깔끔하지 않았다.
- 아스키 코드 표를 살펴보니, 각 괄호의 짝이 1 혹은 2씩 차이가 나는 성질을 이용하여 풀이하였다.