[백준, 자바] 10799번 - 쇠막대기

jinvicky·2024년 5월 14일
0

ALG

목록 보기
44/62
post-thumbnail

문제 링크
https://www.acmicpc.net/problem/10799

최종 코드(정답)

import java.io.BufferedReader;
import java.io.IOException;

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

        int bracketCount = 0;
        int total = 0;

        for (int i = 0; i < brackets.length(); i++) {
            char bracket = brackets.charAt(i);
            if (bracket == '(') {
                bracketCount++;
            } else {
                bracketCount--; // 오답노트~ 이거 무조건 else에서 해줘야 함~
                char prevBracket = brackets.charAt(i-1);
                if (prevBracket == '(') {
                    // 이전 괄호가 (라면 ()이므로 bracketCount만큼 자른다.
                    total += bracketCount;
                } else {
                    // 그냥 ))이므로 하나만 더한다.
                    total++;
                }
            }
        }
        System.out.println(total);
    }
}

풀이
복습하면서 블로그 올린다.

)가 나오면 stack.pop()을 하든 변수값을 --하든 해야 한다.

이게 왜냐면, ()가 완성되어서 쇠막대기들이 일괄로 잘릴 때도 ((((은 4개인데 실제로 생성되는 쇠막대기들은 3개이기 때문이다.

또 ))처럼 닫기 괄호만 계속 나와도
)가 있다는 것은 (이 이전에 있다는 뜻이다.
괄호가 종결되었으므로 기존의 (는 total++을 제외하고 앞으로 쇠막대기들을 자를 때 생성 횟수에 관여할 수 없다.
그래서 무조건 -- 해야 한다.

결론적으로 )면 무조건 --를 하고,
기존 괄호가 (인지 )인지 여부에 따라서 일괄 자르기를 할 것인지, 막대기 개별 종료를 할 것인지 판별하면 될 것이다.

bracketCount--; // 오답노트~ 이거 무조건 else에서 해줘야 함~
char prevBracket = brackets.charAt(i-1);
if (prevBracket == '(') {
                    // 이전 괄호가 (라면 ()이므로 bracketCount만큼 자른다.
                    total += bracketCount;
                } else {
                    // 그냥 ))이므로 하나만 더한다.
                    total++;
                }
profile
일단 쓰고 본다

0개의 댓글