알고리즘 문제풀이

[백준 - 10799 JAVA] 쇠막대기 : Stack 사용

TutleKing 2023. 3. 18. 17:42

생각보다 오래걸린 문제! 
스택을 활용하여 풀면 간단하게 풀릴것이라 생각했지만 레이저의 개수를 직접 세어 막대기의 갯수를 세아리려고 하니 재귀함수 까지 생각이 닿았지만 그럴 필요는 없었음



고려사항

  • 주어진 그림을 가로로만 봐서 어려웠는데, 세로로 보니 답이 보였음
    • 레이저가 발견되면 스택에 쌓여있는 갯수만큼 잘린다 -> 그만큼 더하면됨  
  • 열린 괄호를 만나면 스택에 넣고, 직전 글자를 확인하여 레이저 이면 pop시키고 토탈 카운트를 누적 연산
  • 레이저가 아닌 닫힌 괄호는 해당 막대기의 마무리에 대한 연산은 없었기 때문에 마지막 조각을 더해준다(+1) 

import java.util.*;
import java.io.*;

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

        String text = br.readLine();

        Stack<Character> stack = new Stack<>();
        char prev = ' ';
        int totalCnt = 0;

        char[] chars = text.toCharArray();
        for (char c : chars) {
            if (prev == '(' && c == ')') {
                // Razor인 경우
                stack.pop();
                totalCnt += stack.size();

                prev = c;
                continue;
            }

            if(c == '('){
                stack.push(c);
            } else {
                stack.pop();
                totalCnt += 1;
            }
            prev = c;
        }
        System.out.println(totalCnt);
    }
}

 

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

반응형