[Java] Boj 11899: 괄호 끼워넣기

2025. 2. 22. 13:08·PS/Solve

문제

심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.

(()(()))()()

그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.

(()    ((    )))()    ()

크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.

)))()

승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.

((()))()

그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.

승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.

입력

첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.

출력

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.


풀이

스택 자료구조를 알고 있다면 간단하게 풀이가 가능한 문제이다. 입력되는 문자열에 대해 올바른 괄호열로 만들기 위해 문자열의 앞, 뒤에 붙여야 할 괄호의 개수를 구하여야 한다.

몇 가지 조건을 생각할 수 있는데, 1) )이 등장한다면 반드시 (이 존재해야 한다, 2) (이 등장하였다면 등장한 (의 개수만큼 )이 존재해야 한다.

 

1) 스택에 (이 존재한다면 문자열에 괄호를 붙일 필요가 없다. 따라서 )이 등장하였을 때, 스택에 (이 존재하는지 확인하면 된다. 존재하지 않는다면 괄호를 붙여야 한다. 

2) 문자열을 끝까지 검사했을 때, 스택에 존재하는 (의 개수를 확인해 문자열 끝에 )를 몇 개 붙여야 하는지 알 수 있다.

 

위 조건들을 종합하여 문제를 해결할 수 있다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        Stack<Character> st = new Stack<>();
        String str = bf.readLine();
        int cnt = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch == ')') {
                if (st.isEmpty()) { cnt++; }
                else { st.pop(); }
            } else {
                st.push(ch);
            }
        }
        System.out.println(cnt + st.size());
    }
}
Colored by Color Scripter
cs

'PS > Solve' 카테고리의 다른 글

[Java] Boj 13417: 카드 문자열  (0) 2025.02.22
[Java] Boj 1895: 필터  (0) 2025.02.22
[Java] Boj 1531: 투명  (0) 2025.02.22
[Java] Boj 11659: 구간 합 구하기 4  (0) 2025.02.21
[Java] Boj 1316: 그룹 단어 체커  (0) 2025.02.21
'PS/Solve' 카테고리의 다른 글
  • [Java] Boj 13417: 카드 문자열
  • [Java] Boj 1895: 필터
  • [Java] Boj 1531: 투명
  • [Java] Boj 11659: 구간 합 구하기 4
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (55) N
      • Algorithm (2)
      • PS (17) N
        • Solve (17) N
      • CS (36)
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (19)
        • 형식언어 (1)
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PLT
    java
    선택 정렬
    다이나믹 프로그래밍
    형식언어론
    알고리즘
    객체지향설계
    디자인패턴
    형식언어
    객체지향
    백준 6825
    백준23882
    자료구조
    의미론
    PS
    객체지향언어
    백준
    백준 25418
    언어 타입
    soild 패턴
    디자인 패턴
    최단 경로
    백준13417
    함수
    BOJ
    프로그래밍 언어론
    자료형
    블록 구조 언어
    어휘 분석기
    플로이드 - 워셜
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[Java] Boj 11899: 괄호 끼워넣기
상단으로

티스토리툴바