knight7024   6년 전

저의 접근 방식은 다음과 같습니다.

0. 문자열의 개수가 홀수거나, '('의 개수와 ')'의 개수가 다르면 NO를 도출합니다.

1. 문자열을 받아서 '('와 ')'가 있는 위치를 따로 분류해 둡니다. (코드에서는 f[50]과 s[50]이 그 역할)

2. '('를 분류해둔 배열의 i번째 값에서 n을더한 값을 ')'를 분류해둔 배열에서 찾습니다. (i는 0부터 (의 개수, n는 1부터 문자열의 길이)

3. 찾았으면 두 값을 -1로 체크하는 행동을 반복합니다. (이하, 지운다고 표현)

4. 두 배열을 검사하여 모두 -1이면 YES를 도출합니다.


예를들어 예시에서 (()())((()))는

(의 배열 0, 1, 3, 6, 7, 8
)의 배열 2, 4, 5, 9, 10, 11

처음 n은 1이므로 f[i]+1인 값들을 찾아 모두 지웁니다.

(1, 2), (3, 4), (8, 9) 를 지우게 되면

(의 배열 0, 6, 7
)의 배열 5, 10, 11

가 남게 됩니다.

다음 n은 2인데 f[i]+2인 값들이 없고 3도 없으므로 f[i]+4인 값들을 찾아 모두 지웁니다.

(6, 10), (7, 11) 를 지우게 되면

(의 배열 0

)의 배열 5

가 남게 됩니다.

n은 5일 때 모든 배열의 값이 -1이 되므로 YES를 도출합니다.


두 번째로, )()(는

( 1, 3
) 0, 2

n=1 일 때, (1, 2)가 지워져서

( 3

) 0

인데 조건에 부합하는 n이 없으니 NO입니다.


수를 검색하는 알고리즘은 이진탐색을 사용하였습니다.  댓글을 보고 조금 수정해봤는데도 여전히 틀렸다고 나옵니다.

시간초과도, 메모리초과도 아닌 시작하자마자 바로 틀렸습니다가 나옵니다.

주어진 예시는 당연히 맞는 답이 나오고 질문 게시판에 있는 반례들도 모두 통과했습니다.

스택을 몰라서 어렵게 푼 감이 있지만 알고리즘은 틀리지 않았다고 생각했는데 어디서 틀린걸까요?

ntopia   6년 전

s배열의 임의의 원소가 -1 로 수정되면

s배열 위에서의 이진탐색이 제대로 동작할까요?

ntopia   6년 전

수정된 코드 보고 다시 답글 답니다
f[1] 과 s[1] 을 초기화 하세요.
이전 테케의 값이 남아있어서 오답을 냅니다.

2
())(()
)(

knight7024   6년 전

정말 감사합니다. 몇 시간동안 고민했던게 ㅠㅠㅠㅠ

댓글을 작성하려면 로그인해야 합니다.