본문 바로가기
알고리즘/Java

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

by 조이은 2023. 4. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Level 2. 올바른 괄호

 

접근 방식
제일 먼저 나오는 괄호가 '('가 아닌 ')'라면 false를 내야 한다. 
그 후, 문자열의 길이만큼 반복문 안에서 '('가 나오는 개수와 ')'가 나오는 개수를 세아린다.
   --> 이때, '('의 개수보다 ')'의 개수가 더 많이 나온다면 해당 문자열은 올바른 괄호가 아니므로 false return.

 

시행착오
class Solution {
    boolean solution(String s) {
        boolean answer = true;

        int l = s.length()-s.replace(String.valueOf('('),"").length(); //'('개수 
        int r = s.length()-s.replace(String.valueOf(')'),"").length(); //')'개수
        
        if(s.charAt(0)==')') return false; //첫 글자가 ')'면 false
        if(l!=r) return false; //개수 다르면 false
        
        return answer;
    }
}

처음에는 개수만 맞추면 올바른 괄호인 줄 알았는데, 풀고보니까 예제 중 4개가 틀렸다고 나왔다.

생각해보니까, ()))(( 이런 식으로 '('보다 ')'가 더 많이 나오는 순간이 발생하면 올바른 괄호가 아니었다.

 

 

최종 코드
class Solution {
    boolean solution(String s) {
        boolean answer = true;
        
        int l = 0, r =0;
        
        if(s.charAt(0)==')') return false; //첫 괄호가 )면 false 
        
        for(int i=0; i<s.length(); i++){
            if(l<r)
                return false; // (보다 )개수가 더 많아지는 순간 false 
            
            if(s.charAt(i)=='(') // 개수 세아리기
                l++;
            else if(s.charAt(i)==')')
                r++;
        }
        
        if(l!=r) return false; //짝 개수 안 맞으면 false 
        
        return answer;
    }
}

이런 식으로, 문자열 돌면서 개수 세아려서 ')'가 더 많이 나오는 순간 false를 반환하니까 정답이었다.

 

 

고찰

생각보다 되게 빨리 푼 문제였다. 문제를 다 풀고나니까, 스택/큐 관련 문제란 걸 깨달았다..

하지만 굳이 스택/큐를 구현하지 않고 단순하게 문제를 풀 수 있었다! 사람들이 쓴 글 보니까, 스택/큐로 구현하면 효율성을 만족하지 못한다는 글을 봤다. 다른 사람들이 푼 결과도 많이 찾아보면 좋을 것 같다.