루피도 코딩한다

[백준 9012번: 괄호](Java) 본문

Algorithm

[백준 9012번: 괄호](Java)

xiaolin219 2022. 5. 12. 13:34

알고리즘 분류 : Stack (Stack으로도 풀 수 있으나, 해당 게시물에서는 Stack의 속성만을 이용)

 

Stack으로도 풀 수 있는 문제이지만, 올바른 괄호 표현식의 원리를 이용해서 정수 Int type 변수 하나만을 사용했다.

 

[풀이 로직]

1. N을 읽는다

2. N번 String을 받아온다. // "(()))())("

3. 각 케이스마다 새롭게 사용할 index와 input을 초기화 해준다.

    * index의 경우, stack의 top을 가리키는 변수와 동일하게 -1로 설정 해 주었다.

3. 2번에서 받아온 길이만큼 반복문을 돌리며 괄호 하나 하나를 검사한다

4. 정상적인 괄호식의 경우 '('부터 시작하므로, '(' 가 들어오면 index 변수에 +1을 해준다 // stack 에서의 push에 해당

5. ')'가 들어왔다는 것은 무조건 짝 지을 '('가 있어야 한다.

    5-1 index == -1 이면 짝 지을 '('가 없다는 뜻이므로 NO를 출력한다

    5-2 짝 지을 '('가 있다면 index -= 1 // stack에서의 pop에 해당

6. 모든 괄호 검사를 끝낸 이후에, index가 최초상태인 -1이 아니라면 '(' 만 남아있다는 뜻이므로 NO 를 출력하고, 그렇지 않다면 YES를 출력한다

 

NOTE 1. 이중 반복문을 사용하며, inner loop 에서 바로 outer loop의 break 혹은 coninue를 호출하고 싶을 경우 아래와 같이 사용가능하다. (번외) 내가 애정하는 kotlin에서는 outerLoop@ 로 해당 기능을 지원한다

출처 : https://jinn-blog.tistory.com/8

outerLoop :
for (int i = 0 ; i< N; i++){
	for (int j = 1; j< N; j++){
        continue outerLoop;
    }
    // continue outerLoop; 가 실행되면 이부분의 코드는 실행되지 않음
}

 

NOTE 2. BufferedWriter를 사용할 때는 flush()를 호출해주어야 버퍼에 있는 값이 출력된다.

 


[정답 코드]

import java.io.*;

public class Main {
    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 N = Integer.parseInt(br.readLine());
        String input;
        char ps;
        int index;

        outerLoop:
        for (int i = 0; i < N; i++) {
            index = -1;
            input = br.readLine();
            for (int j = 0; j < input.length(); j++) {
                ps = input.charAt(j);
                if (ps == '(') index += 1;
                else {
                    if (index == -1) {
                        bw.write("NO\n");
                        bw.flush();
                        continue outerLoop;
                    } else index -= 1;
                }
            }
            if (index != -1) bw.write("NO\n");
            else bw.write("YES\n");
            bw.flush();
        }
    }
}

 

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

Comments