본문 바로가기
코딩테스트 준비/SWEA

[SWEA] 5432번 - 쇠막대기 자르기 [Java]

by mwzz6 2025. 2. 13.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWVl47b6DGMDFAXm

 

[SWEA] 5432번 - 쇠막대기 자르기 [Java]
[SWEA] 5432번 - 쇠막대기 자르기 [Java]
[SWEA] 5432번 - 쇠막대기 자르기 [Java]


1.  아이디어

 

Stack 자료구조를 활용하면 해결할 수 있다.


2. 문제풀이

 

열린 괄호 뒤에 닫힌 괄호가 오면 레이저, 닫힌 괄호 뒤에 닫힌 괄호가 오면 쇠막대기의 끝 부분이 된다. 이를 위해 현재 괄호 이전에 어떤 괄호가 나왔는지 before 변수에 저장하는 방식으로 구현했다. 열린 괄호는 쇠막대기의 시작 또는 레이저 후보이므로 일단 Stack에 넣고 닫힌 괄호가 등장했을 때 레이저면 지금까지 등장한 쇠막대기의 수만큼 조각이 생기고, 닫힌 괄호가 쇠막대기의 끝이면 해당 쇠막대기 조각 1개가 생긴다.


3. 코드

 

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

public class Solution {
    public static void main(String[] args) throws IOException {
//        BufferedReader br = new BufferedReader(new InputStreamReader(Solution.class.getResourceAsStream("sample_input.txt")));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            char[] input = br.readLine().toCharArray();

            Deque<Character> stack = new ArrayDeque<>();
            char before = '\u0000';
            int cnt = 0;

            for (char c : input) {
                if (c == '(') {
                    stack.push('(');
                } else {
                    stack.pop();

                    if (before == '(') cnt += stack.size();
                    else cnt++;
                }

                before = c;
            }

            sb.append("#").append(tc).append(" ").append(cnt).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기