올바른 괄호

내 할일 잘 하기·2023년 2월 23일
0

Programers :: Level 2

목록 보기
3/7
💡

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer
"()()"true
"(())()"true
")()("false
"(()("false

입출력 예 설명

입출력 예 #1,2,3,4문제의 예시와 같습니다.

나의 생각

true / false의 가능성을 검증 → 처음으로 나오는 괄호 한 쌍 ‘(’ / ‘)’ 삭제처리 → 재귀함수 하면되지않을까?

⇒ 시간복잡도에서 털리는 것 같다.. 효율성 실패

“()”를 replaceAll로 제거하면?

⇒ 여전히 효율성 실패…

각각의 괄호를 제거하지 말고, “()”를 계속 replaceAll로 제거하면? 효율이 좋을 것 같진 않은데, 각각의 괄호를 제거하는 과정보다는 좋을 것 같다.

⇒ 여전히 효율성 실패…

문자열의 중간을 기점으로, 좌측에 ‘(’보다 ‘)’가 많으면 false !? 음..

이와 같은 방식은 아닌 것 같다..

괄호를 열었으면 닫히는 방식으로 생각해서, 스택 구조를 생각해보자.

⇒’)’가 스택에 쌓였을 때, 스택에 남은 ‘(’가 없으면 false. 문자열이 전부 clear되면 true 방식으로 구현하자.

⇒ count 변수를 만들고, ‘(’를 만나면 +1, ‘)’를 만나면 -1, count가 음수면 false, 문자열이 clear되면 true

나의 풀이

function solution(s){
    let count = 1;
    for(let i =0;i<s.length;i++) {
        if(count < 1){
            return false
        } else if(s[i] === '(') {
            count++
        }else {
            count--
        }
    }
    return count === 1
}

function solution(s){
    let count = 1;
    while(count>0 && s.length !== 0){
        if(s[0] === '(') {
            count++
        }else{
            count--
        }
        s = s.slice(1);
    }
    return count === 1
}

오류 분석

효율성 테스트 결과가 오락가락 한다..

같은 코드가 됬다가 안됬다가..

string을 여러번 수정하는 것 보다, 넘버 카운트 등으로 처리하는게 훨씬 가벼운 듯!!

profile
함께 일하고싶은 개발자로 기억될래요

0개의 댓글