백준 11899 - 괄호 끼워넣기
문제
심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.
(()(()))()()
그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.
(() (( )))() ()
크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.
)))()
승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.
((()))()
그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.
승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.
입력
첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.
출력
첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.
자료 구조 문제에서 흔히 나오는 문제라고 하는데, 비전공자에 기초가 없으니 헷갈린다.
(
가 먼저 입력되는 경우와 )
가 먼저 입력되는 경우가 다르다는 점에 유의하자. 나는 딕셔너리(l
)를 만든 다음, 주어진 조건에 맞춰 반복문 안에서 더하기와 빼기를 수행했다. 이렇게.
w = input()
l = {'(': 0, ')': 0}
cnt = 0
for i in w:
if i == '(':
if l[')'] == 0:
cnt += 1
l['('] += 1 # 이건 '('가 입력됐을 경우에만 해당한다.
else:
l[')'] -= 1
cnt -= 1
else:
if l['('] == 0:
cnt += 1
else:
l['('] -= 1
cnt -= 1
print(cnt)
일단 맞혔으니, 보다 효율적인 코드들을 검색해본다.
[방법2]
여는 괄호((
)가 나오면 l+=1
을 해주고 ans+=1
해준다.
닫는 괄호()
)가 나오면 다시 둘로 나뉜다. 여는 괄호 카운팅(l
)이 1보다 작으면 l
을 초기화하고 ans+=1
, 1 이상이면 괄호의 짝이 맞은 경우이므로 l-=1
만 해주면 된다. 반복문이 끝나면 ans
와 l
을 더한 값이 더해줘야 할 괄호의 최소 개수가 된다.
w = input()
ans = 0
l = 0
for i in w:
if i == '(':
l += 1
else:
if l < 1:
ans += 1
l = 0
else: l -= 1
print(ans + l)
[방법3]
문자열에서 ()
가 없어질 때까지 while
문을 계속 돌리고, 남는 문자열 길이를 출력한다.
s = input().rstrip()
l = len(s)
while True:
s = s.replace("()","")
l -= 1 # '()'이 더 이상 없더라도 반복문이 돌 때마다 l은 1씩 줄어든다.
if l == 0:
print(len(s)) # 짝이 안 맞는 괄호 개수 출력하고 반복문 종료
break
[문제 보기]