Information Security Study

[백준] 10799: 쇠막대기 본문

Programming/JAVA

[백준] 10799: 쇠막대기

gayeon_ 2024. 1. 19. 17:00

입출력 예시다.

 

괄호가 바로 열고 닫히는 경우 레이저가 발사되며

그렇지 않은 경우에는 쇠막대기가 놓인다.

 

위 이미지를 자세히 보면

레이저가 발사되기 전의 괄호 갯수만큼 쇠막대기가 분할되는 것을 알 수 있다.

 

예를 들어 (((()의 경우 짝이 맞는 () 전에 존재하는 (의 갯수가 3개이고

쇠막대기도 마찬가지로 3개가 생성된다.

 

((()()의 경우

첫 번째 레이저가 발사되는 ()이전의 괄호 갯수는 3개,

두 번째 레이저가 발사되는 ()이전의 괄호 갯수도 3개이므로 총 6개의 쇠막대기가 생긴다.

 

레이저 발사 후 바로 )가 들어오는 경우에는 쇠막대기가 하나만 생성된다.

 

이를 코드로 작성하기 위해서는 스택을 사용하는 것이 용이하다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {
        // StringBuilder를 사용하여 결과를 한 번에 출력하기 위한 객체 생성
        StringBuilder sb = new StringBuilder();

        // BufferedReader를 사용하여 입력을 받기 위한 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 괄호 문자열 입력 받기
        String s = br.readLine();

        // 결과 출력 및 쇠막대기 개수 계산
        sb.append(solve(s)).append("\n");

        // 결과 출력
        System.out.println(sb);
    }

    // 괄호 문자열을 받아 쇠막대기의 개수를 계산하는 함수
    public static String solve(String s) {
        // 저장할 스택 생성
        Stack<Character> stack = new Stack<>();

        // 쇠막대기의 개수를 저장할 변수
        int N = 0;

        // 괄호 문자열을 순회하면서 쇠막대기의 개수 계산
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (c == '(') {
                // 여는 괄호일 경우 스택에 push
                stack.push(c);
            } else if (c == ')') {
                // 닫는 괄호일 경우 스택에서 pop
                stack.pop();

                // 바로 앞이 여는 괄호일 경우 현재 스택의 크기만큼 쇠막대기가 끝났음을 의미
                if (s.charAt(i - 1) == '(') {
                    N += stack.size();
                } else {
                    // 바로 앞이 닫는 괄호일 경우 현재 위치에 끝나는 쇠막대기 추가
                    N++;
                }
            } else {
                // 괄호 이외의 문자가 들어온 경우 에러 메시지 반환
                return "some error message";
            }
        }

        // 계산된 쇠막대기의 개수 반환
        return String.valueOf(N);
    }
}

'Programming > JAVA' 카테고리의 다른 글

[백준] 1874: 스택 수열  (0) 2024.01.22
[백준] 3986: 좋은 단어  (0) 2024.01.19
[백준] 9012: 괄호  (0) 2024.01.19
[백준] 4949: 균형잡힌 세상  (0) 2024.01.18
[백준] 10828: 스택  (0) 2024.01.18