괄호로만 이루어진 문자열이 주어질때 연속하는 부분 문자열 중 가장 긴 올바른 괄호 문자열의 길이를 구하는 문제
-------------------------------------------------------------------------------------------------------------------------------------------------------
올바른 괄호 문자열을 구하는 알고리즘은 스택을 이용해서
스택이 비어있는데 (이 들어오면 넣고
스택이 비어있지 않을때, (이 들어오는 경우, 스택의 마지막 문자가 (인 경우에는 (이 들어올 수 있고
)이 들어오는 경우, 스택의 마지막 문자가 (인 경우에는 제거하고
마지막에 스택이 비면 올바른 괄호 문자열이 되는 그런 알고리즘인데
https://deepdata.tistory.com/38
stack 활용법 - 올바른 괄호 문자열 판별
1. 문제 https://programmers.co.kr/learn/courses/30/lessons/76502 코딩테스트 연습 - 괄호 회전하기 programmers.co.kr 다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다. (), [], {} 는 모두 올바
deepdata.tistory.com
이번엔 부분 문자열중 가장 긴 올바른 괄호 문자열의 길이를 구해야한다
이럴때는 스택에는 인덱스를 넣는다
1) 초기에는 [-1]로 시작
2) 들어오는 문자가 (이면 현재 인덱스를 스택에 넣는다
3) 들어오는 문자가 )이면 스택에서 인덱스를 빼고, 스택이 비어있지 않다면,
(현재 문자의 인덱스 - 스택의 마지막 위치의 인덱스)가 올바른 괄호 부분 문자열의 길이가 되므로 최댓값을 갱신
4) 스택이 비어있다면, 더이상 올바른 괄호 문자열이 되지 않으므로 현재 인덱스를 넣어준다
예를 들어 s = ')()()'이라고 하자
처음에 [-1]
먼저 )이 들어오는데, 스택에서 하나 빼면 [], 비어있으므로 현재 인덱스를 넣는다 [0]
(이 들어오면 일단 스택에 넣는다 [0,1]
)이 들어오면 스택에서 하나 빼고 [0], 현재 인덱스 2 - 스택의 마지막 인덱스 0 = 2는 현재 괄호 문자열의 길이 () 2이다
그리고 (이 들어오면 [0,3]
그리고 )이 들어오면 하나 빼고 [0], 현재 인덱스 4에서 스택의 마지막 인덱스 0을 빼면 4-0 = 4가 가장 긴 괄호 문자열 ()()이다
스택에 들어가는 인덱스가 올바른 괄호문자열의 인덱스-1이 들어가니까 되는듯?
n = int(input())
A = list(input())
stack = [-1]
answer = 0
for i in range(n):
if A[i] == '(':
stack.append(i)
else:
s = stack.pop()
if len(stack) == 0:
stack.append(i)
else:
if answer < i-stack[-1]:
answer = i-stack[-1]
print(answer)
'알고리즘 > 자료구조(스택,큐,해시맵)' 카테고리의 다른 글
스택으로 쌓아놓은 수열에서 조건을 만족하는 값들이 언제부터 다 나오는가? (0) | 2025.02.27 |
---|---|
O(N)으로 순서쌍 찾기1 - 기울기가 K인 직선의 개수 (0) | 2025.02.19 |
코딩테스트 복기 - 배열에서 특정 수보다 작은 수 중 가장 가까운 수를 찾는 방법(find nearest element than smaller one on the left side) (0) | 2023.05.22 |
[Java]자바로 구현하는 절댓값 우선순위 큐 (0) | 2023.03.22 |
[Java]우선순위 큐 응용 - MN개의 조합에서 조건을 만족하는 k번째 수를 찾는 빠르게 찾는 방법 1편 (0) | 2023.03.21 |