프로그래머스 Lv2 올바른 괄호

weonest·2023년 4월 10일
0

coding-test

목록 보기
5/36

문제 설명

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

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

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

제한사항

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

입출력 예

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

입출력 예 설명

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


나의풀이

우선 문자의 첫 시작이 “)” 일 경우에는 오답이기 때문에 이에 해당하지 않는 문자열들로만 비교를 진행할 수 있도록 하였다.

그후 “(” 의 개수를 세는 lCnt“)” 의 개수를세는 rCnt 변수를 만들었는데, 완벽한 괄호“()” 는 lCnt와 rCnt가 일치한다.

즉, 비교 도중 lCnt보다 rCnt가 커지면 참이 아니며, 완벽한 괄호를 이뤘을 경우에는 lCnt, rCnt를 초기화 해주었다. 또한 완벽한 괄호를 이루지 않고 비교 연산이 끝난 경우 ( lCnt, rCnt > 0 ) 역시 참이 아닐 것이다.

이를 코드로 표현하면 다음과 같다

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        String[] tmp = s.split("");

        if (tmp[0].equals(")")) {
            answer = false;
            return answer;
        }

        int lCnt = 1;
        int rCnt = 0;

        for (int i = 1; i < s.length(); i++) {
            if (tmp[i].equals(("("))) {
                lCnt++;

            } else if (tmp[i].equals(")")) {
                rCnt++;
            }
            if (rCnt == lCnt) {
                lCnt = 0;
                rCnt = 0;
            }

            if (rCnt > lCnt) {
                answer = false;
                break;
            }

        }

        if (rCnt > 0 || lCnt > 0) {
            return answer = false;
        }

        return answer;
    }
}

접근법은 괜찮았다고 생각하는데 효율성 코드를 통과하지 못하였다. 그래서 진행한 리팩토링은 불필요한 String 비교를 없애기 위해 String[] 배열을 없애고 char로 비교하며, rCntlCntcnt로 통합하였다.

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        int cnt = 0;

        if (s.charAt(0) == ')') {
            answer = false;
            return answer;
        }

        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                cnt++;
            } else if (s.charAt(i) == ')') {
                cnt--;
            }

            if (cnt < 0) {
                answer = false;
                break;
            }
        }
        if (cnt != 0) {
            return answer = false;
        }

        return answer;
    }
}

0개의 댓글