Post

[Baekjoon/Programmers] 9012 괄호

9012 괄호 문제는 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내야 하는 문제이다. 처음엔 정말 간단하게 “(“의 수와 “)”의 개수가 맞으면 되는 거 아닐까? 라고 생각했지만, 생각해보니 이런 방식으로 코드를 작성하면 “())(()” 의 경우도 YES라고 출력하게 된다. 괄호를 열기 전엔 닫을 수 없고, 열린 괄호는 언젠가 반드시 닫혀야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args)  throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.parseInt(br.readLine());

        for(int i=0; i<num; i++) {
            String input = br.readLine();
            int isVps = 0;
            for (String s: input.split("")) {
                if (s.equals("(")) isVps++;
                else if (s.equals(")")&&(isVps==0)) {
                    isVps = -50;
                    break;
                } else isVps--;
            }

            System.out.println(isVps==0? "YES": "NO");
        }
    }
}

정말 단순하게 “(“ 일 때는 isVps에 1씩 더해주고, “)” 일 때는 isVps에 1씩 빼주었다. 우선, 여는 괄호와 닫는 괄호의 개수가 맞아야 하므로 isVps가 0이라면 “YES”를 출력한다. 여는 괄호가 더 많다면 isVps는 양수일 것이고, 닫는 괄호가 더 많다면 isVps는 음수가 될 것이다. 덧붙여, 괄호가 열려있지 않는데 닫는 괄호가 오게 된다면 당연히 이는 VPS가 될 수 없으므로, isVps가 0인데 (열려 있기만 한 괄호가 없을 때) 닫는 괄호가 오게 된다면 vps에 -50을 넣고 (괄호 문자열의 길이는 50 이하라는 조건이 있었음) 반복문을 빠져나오는 식으로 코드를 작성했다.

문제를 맞췄지만 뭔가… 정말 멋없다…. 그래서 다시 고쳐보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
public static void main(String[] args)  throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.parseInt(br.readLine());

        for(int i=0; i<num; i++) {
            String input = br.readLine();
            
            int vpsCount = 0;
            boolean isVps = false;

            for (String s : input.split("")) {
                if (s.equals("(")) vpsCount++; // vpsCount가 양수이면 여는 괄호가 더 많다는 뜻
                else {
                    if (vpsCount == 0) {
                        vpsCount--; //닫는 괄호가 여는 괄호보다 먼저 있는 경우는 무조건 VPS가 아니다. 더 볼 필요가 없으므로 break
                        break;
                    }
                    vpsCount--;  // vpsCount가 음수이면 닫는 괄호가 더 많다는 뜻
                }

            }
            if (vpsCount==0) isVps = true;
            System.out.println(isVps? "YES": "NO");

        }
    }
}

으음… 사실 더 길어지기만 한 것 같지만… 냅다 isVps를 -50해주는 것보단 낫지 않나… else도 좀 더 간결해진 것 같긴 한데…

This post is licensed under CC BY 4.0 by the author.