SW Expert Academy - 1218번(괄호 짝짓기)

최지홍·2022년 2월 7일
0

SW Expert Academy

목록 보기
8/36

문제 출처: 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씩 차이가 나는 성질을 이용하여 풀이하였다.
profile
백엔드 개발자가 되자!

0개의 댓글

관련 채용 정보