Algorithm & Data Structure/문제풀이

[Algorithm] 백준 9012(BOJ 9012) 괄호 문제풀이 (Java)

coding-knowjam(코딩노잼) 2021. 8. 10.
728x90

안녕하세요 Coding-Knowjam입니다.

오늘은 백준 온라인 저지에 있는 9012번 괄호 문제를 풀어보겠습니다.

문제에 대한 링크는 아래에 있으니 문제를 먼저 읽고 와주시길 바랍니다.

https://www.acmicpc.net/problem/9012

 

1. 문제 설명

문제에서 요구하는 바는 주어진 문자열이 괄호가 전부 짝이 맞는지? 짝이 맞다면 전부 닫혀있는지?를 판단해서 YES와 NO를 출력하면 되는 문제입니다.

문제에서 얘기하는 VPS가 되는 조건은 당연히 ()() (()) 이런 식으로 전부 잘 닫히는 경우니 VPS가 아닌 경우를 걸러내면 쉽게 풀 수 있습니다.

VPS가 아닌 경우는 다음과 같습니다.

  • 괄호의 시작이 ")"로 시작하는 경우
  • "(()))" , "((())" 이런 식으로 괄호의 짝이 안 맞는 경우
  • "(()()))(" 괄호가 중간에 짝이 잘 맞다가 갑자기 ")"가 먼저 시작되는 경우

위와 같은 경우에는 모두 VPS가 아니므로 위의 3가지 경우를 고려해서 구현하면 됩니다.

그럼 코드로 작성해보겠습니다.

 

2. Java로 문제 풀이

package study.blog.codingnojam.algorithm.boj;

import java.io.*;

public class BOJ_9012 {

    // 백준온라인저지 9021번 괄호 문제풀이 Java
    public static void main(String[] args) throws IOException {

        // 입출력을 위한 객체
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 테스트 케이스 횟수 받기
        int T = Integer.parseInt(br.readLine());

        // 테스트 케이스 횟수만큼 반복
        for (int i = 0; i < T; i++) {
            // VPS판단 여부를 따질 문자열
            String testData = br.readLine();

            // VPS판단에 사용할 변수
            int count = 0;

            // VPS여부를 저장할 변수
            boolean chk = false;

            // 받은 문자열의 길이만큼 반복
            for (int j = 0; j < testData.length(); j++) {
                // 좌측괄호 이면 카운트 1증가
                if (testData.charAt(j) == '(') {
                    count++;
                } else {
                    // 우측괄호이면 카운트 1 감소
                    count--;
                }

                // 카운트가 0보다 작은 즉, -1이라면 VPS가 무조건 될 수 없음
                if (count < 0) {
                    // ture면 VPS가 아님
                    chk = true;
                    break;
                }

                // 문자열의 마지막 문자까지 체크한 후에
                // 카운트가 양수라면 즉, 0이 아니라면 괄호가 짝이 안맞은 경우임
                if (j == testData.length()-1 && count > 0) {
                    chk = true;
                }
            }

            // true면 VPS가 아니므로 NO
            if (chk) {
                bw.write("NO");
            } else {
                // false면 VPS이므로 YES
                bw.write("YES");
            }
            // 출력 서식에 맞춰 한칸씩 띄우기
            bw.newLine();
        }

        // 출력
        bw.flush();
        bw.close();
    }
}

 

작성한 코드의 라인마다 주석을 모두 달아놓았습니다.

코드와 주석을 같이 읽으시면 이해하는데 어렵지 않으실 거라 생각합니다.

감사합니다.


728x90

댓글