문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.
(()(()))()()
그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.
(() (( )))() ()
크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.
)))()
승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.
((()))()
그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.
승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.
[입력]
첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.
[출력]
첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.
[풀이]
1. 스택을 사용해 입력된 괄호들을 스택에 담아준다.
2. 닫는 괄호(')')와 여는 괄호('(')가 서로 짝을 이루어야 하므로 이를 이용해 문제를 해결한다.
3. 스택에서 값을 빼 내 주면서 닫는 괄호와 여는 괄호의 매칭 되는 개수를 제외하고 나머지 수를 구해준다.
4. 그 후 그 값을 출력해준다.
[접근]
1. 괄호가 서로 매칭되는 경우는 추가할 필요가 없지만 아닌 경우는 추가를 해주어야 한다는 점을 이용해 문제를 풀어야겠다고 생각했다.
[코드]
package BOJ_silver;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main_S4_11899 {
static int right;
static int cnt;
static Stack<Character> stack;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
stack = new Stack<>();
// 각 괄호들을 스택에 담아준다.
for (int i = 0; i < str.length(); i++) {
stack.push(str.charAt(i));
}
while (!stack.isEmpty()) {
// 한 문자씩 잘라서 체크
char c = stack.pop();
// 만약 닫는 괄호라면
if (c == ')') {
right++; // right 카운트를 증가
}
// 여는 괄호면서 right가 0이 아니라면 정상적으로 닫을 수 있으니까
else if (c == '(' && right != 0) {
right--; // right를 감소
}
// 여는 괄호면서 right가 0이라면 정상적이지 않은 괄호니까
else if (c == '(' && right == 0) {
cnt++; // 필요한 추가 괄호의 수를 증가
}
}
// 모든 스택을 다 비웠는데 닫는 괄호가 남아 있다면
// 남은 수만큼 여는 괄호가 필요하다는 뜻
if (right != 0) {
cnt += right; // 그 수만큼 증가
}
System.out.println(cnt);
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S2 14241번 슬라임 합치기 (0) | 2021.12.31 |
---|---|
[백준] S4 12789번 도키도키 간식드리미 (JAVA) (1) | 2021.12.28 |
[백준] S3 10972번 다음 순열 (JAVA) (0) | 2021.12.27 |
[백준] S4 9536번 여우는 어떻게 울지? (JAVA) (0) | 2021.12.23 |
[백준] S1 16500번 문자열 판별 (JAVA) (0) | 2021.12.22 |