20230622 [프로그래머스][Java] 올바른 괄호

Daisy🌷·2023년 6월 22일

1. 문제 이해

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻이다.
예를 들어 "()()" 또는 "(())()"는 올바른 괄호이다.
")()(" 또는 "(()("는 올바르지 않은 괄호이다.
"(" 또는 ")" 로만 이루어진 문자열 string이 주어졌을 때, 문자열 string이 올바른 괄호이면 true를 return하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성하라.

2-1. 풀이 계획 및 작성한 코드 (통과하지 못함.)

  • 문자열을 한글자씩 잘라서 새로운 배열에 담는다.
  • 일단 시작하는 괄호가 닫히는 괄호면 false를 반환한다.
  • 시작하는 괄호가 열리는 괄호면 일단 통과! 그렇다면 이제 열린 괄호의 개수와 닫히는 괄호의 개수를 세야 한다.
  • 열린 괄호의 개수와 닫힌 괄호의 개수가 같으면 올바른 괄호이고, 열린 괄호의 개수와 닫힌 괄호의 개수가 다르면 올바르지 않은 괄호이다.
public class Solution {
    boolean solution(String string) {
        boolean answer = true;

        String[] parentheses = string.split("");

        int openCount = 0;
        int closeCount = 0;

        for (int i = 0; i < parentheses.length; i += 1) {
            if (parentheses[0].equals(")")) {
                return false;
            }

            if (parentheses[i].equals("(")) {
                openCount += 1;
            }

            if (parentheses[i].equals(")")) {
                closeCount += 1;
            }
        }

        if (openCount == closeCount) {
            answer = true;
        }

        if (openCount != closeCount) {
            answer = false;
        }

        return answer;
    }
}

이렇게 풀이하면 여는 괄호와 닫는 괄호의 개수만 확인하기 때문에 괄호가 제대로 쌍을 이루는지는 확인하지 못한다.

2-2. 풀이 계획 및 작성한 코드 (효율성 테스트에서 통과하지 못함.)

  • 일단 시작하는 괄호가 닫히는 괄호면 false를 반환한다.
  • 배열의 요소가 "(" 일 때는 count를 늘려주고
    배열의 요소가 ")" 일 때는 count를 줄여준다.
  • count가 0보다 작다면 break를 걸어준다.
  • 반복문이 모두 돌아간 뒤 count가 0이라면 answer = true가 된다.
public class Solution {
    boolean solution(String string) {
        boolean answer = false;

        String[] parentheses = string.split("");

        int count = 0;

        for (int i = 0; i < parentheses.length; i += 1) {
            if (parentheses[0].equals(")")) {
                return false;
            }

            if (parentheses[i].equals("(")) {
                count += 1;
            }

            if (parentheses[i].equals(")")) {
                count -= 1;
            }

            if (count < 0) {
                break;
            }
        }

        if (count == 0) {
            answer = true;
        }

        return answer;
    }
}

2-3. 드디어 통과한 코드 ^_^ v

  • 문자열을 배열로 분할하는 대신 charAt() 메서드를 사용하여 문자에 직접 접근할 수 있도록 하였다. 나머지는 2-2와 동일!
public class Solution {
    boolean solution(String string) {
        boolean answer = false;
        
        int count = 0;

        for (int i = 0; i < string.length(); i += 1) {
            if (string.charAt(0)==')') {
                return false;
            }

            if (string.charAt(i)=='(') {
                count += 1;
            }

            if (string.charAt(i)==')') {
                count -= 1;
            }

            if (count < 0) {
                break;
            }
        }

        if (count == 0) {
            answer = true;
        }

        return answer;
    }
}

첫번째 풀이는 단순히 여는 괄호와 닫힌 괄호의 개수만 세지만, 두번째 풀이는 하나의 count 변수를 사용하여 여는 괄호와 닫는 괄호 사이의 균형을 확인한다.

profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글