문제
심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.
(()(()))()()
그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.
(() (( )))() ()
크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.
)))()
승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.
((()))()
그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.
승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.
입력
첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.
출력
첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.
풀이 과정
올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수는, 올바르지 않게 붙여진 괄호의 개수이다.
Ex.
))(()) -> 앞에 (( 붙이기
(((()) -> 뒤에 )) 붙이기
()))(( -> 앞에 ((, 뒤에 )) 붙이기
(()(() -> 뒤에 )) 붙이기
해결 방법은, 이어지지 않는 닫는 괄호도 스택에 같이 포함한다.
기존에는 닫는 괄호가 나온다면 올바르지 않은 문자열로 판단하고 종료시켰지만, 몇 개의 닫는 괄호가 이어지지 않았는지를 세야 하기 때문에 닫는 괄호까지 스택에 추가한다. ( 물론, 여는 괄호가 최근에 쌓였다면 그 닫는 괄호와 매칭되므로, 스택에 있던 여는 괄호가 지워진다. )
만약 스택에 닫는 괄호가 남아있다면 앞에 여는 괄호를 더 붙여야 하는 것이고, 스택에 여는 괄호가 남아있다면 뒤에 닫는 괄호를 더 붙여야 하는 것이다!
스택에 괄호를 추가하는 조건은 다음과 같다.
1. 여는 괄호거나 닫는 괄호가 들어올 때 스택이 비어있다면, 여는 괄호면 다음 괄호 매칭을 위해 추가하고, 닫는 괄호면 앞에 더 추가해야 이어질 수 있는 괄호이기에 추가한다.
2. 스택이 비어있지 않고 여는 괄호가 들어온다면 스택에 추가한다.
3. 스택이 비어있지 않고 닫는 괄호가 들어올 때 스택에 마지막으로 닫는 괄호가 추가됐다면 스택에 닫는 괄호를 추가한다. 마지막에 여는 괄호가 추가됐다면 연결되어서 스택에서 빼야 한다.
C
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100];
gets(str);
char stack[100];
int stackSize = 0;
for (int i = 0; i < strlen(str); i++) {
if (stackSize == 0 || str[i] == '(' || stack[stackSize - 1] == ')') stack[stackSize++] = str[i];
else stackSize -= 1;
}
printf("%d", stackSize);
return 0;
}
Python
import sys
input = sys.stdin.readline
string = input().rstrip()
stack = []
for s in string:
if len(stack) == 0 or s == '(' or stack[-1] == ')': stack.append(s)
else: stack.pop()
print(len(stack))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 11723 : 집합 ( SILVER 5 ) / C, Python (0) | 2023.11.28 |
---|---|
[ BOJ ] 29730 : 임스의 데일리 인증 스터디 ( SILVER 3 ) / C, Python (0) | 2023.11.27 |
[ BOJ ] 1406 : 에디터 ( SILVER 2 ) / C, Python (0) | 2023.11.26 |
[ BOJ ] 11656 : 접미사 배열 ( SILVER 4 ) / C, Python (0) | 2023.11.26 |
[ BOJ ] 2999 : 비밀 이메일 ( BRONZE 1 ) / C, Python (0) | 2023.11.25 |