존재할 수 있는 괄호쌍 중 가장 긴 길이를 찾는 문제이다.
구상한 방법
- '(' 갯수보다 ')' 가 많으면 모든 count 초기화.
- '(' 갯수와 ')' 갯수가 같아지는 시점에 max값과 비교하여 크면 max에 대입.
이런 식으로 한다면 ' ( ) ( ( ( ) ) ' 과 같은 경우
-> | ( | ) | ( | ( | ( | ) | ) |
( 갯수 | 1 | 1 | 2 | 3 | 4 | 4 | 4 |
) 갯수 | 0 | 1 | 1 | 1 | 1 | 2 | 3 |
Max = 2 개가 된다. 하지만 답은 Max = 4 이다. (초록 부분)
( 갯수보다 ) 갯수가 더 적은 경우 왼쪽에 빨간 답으로 만들어진 괄호쌍이 포함되지 않는 것은 좋지만,
새롭게 초록색 부분이 답이 되지 못한다.
솔루션을 본 결과, 이 수행을 거꾸로 한번 더 해주면 답을 구할 수 있다.
( | ) | ( | ( | ( | ) | ) | <- |
1 | 0 | 3 | 2 | 1 | 0 | 0 | ( 갯수 |
1 | 1 | 2 | 2 | 2 | 2 | 1 | ) 갯수 |
거꾸로 수행하므로, ) 갯수보다 ( 갯수가 많아지면 카운팅을 초기화 시킨다.
정말 신선한 방법이라고 생각된다.
한번에 처리할 수 없으면 거꾸로 한번 더 수행하여 할 수 있다는 방법을 깨닫게 해주었다.
** 또한 ' reversed(range(x)) '를 쓰면 거꾸로 숫자가 흐른다. **
( range(len(x),0,-1)을 사용할 경우 0을 포함하지 않게된다. )
소스코드
class Solution:
def longestValidParentheses(self, s: str) -> int:
op = 0
cl = 0
result = 0
for i in range(len(s)):
if s[i] == "(":
op += 1
elif s[i] == ")":
cl += 1
if op == cl:
if result < op + cl:
result = op + cl
elif op < cl:
op = 0
cl = 0
op = 0
cl = 0
for i in reversed(range(len(s))):
if s[i] == "(":
op += 1
elif s[i] == ")":
cl += 1
if op == cl:
if result < op + cl:
result = op + cl
elif op > cl:
op = 0
cl = 0
return result
'Leetcode Top 100' 카테고리의 다른 글
34. Find First and Last Position of Element in Sorted Array (0) | 2021.01.23 |
---|---|
33. Search in Rotated Sorted Array (0) | 2021.01.21 |
23. Merge k Sorted Lists (0) | 2021.01.19 |
22. Generate Parentheses (0) | 2021.01.18 |
21. Merge Two Sorted Lists (0) | 2021.01.18 |