본문 바로가기

코딩테스트

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

728x90

 

🤔 문제 풀이

size라는 변수를 정의해두고 '(' 가 등장하면 size + 1, ')' 가 등장하면 size -1 을 하게 했다.

그리고 매번 size를 검사하여 만약 size가 0보다 작은 경우 즉시 false를 리턴,

또한 마지막에 size를 다시 한번 검사하여 size != 0인 경우 false를 리턴하도록 했다.

여기까진 문제가 없으나 괄호가 담긴 문자열을 순회하기위해 문자열.split("")을 사용하여

괄호 문자열을 String 배열로 변환했고 String 배열에 인덱스로 접근하여 각 인덱스별 문자에

접근했다. 하지만 효율성에서 시간초과 발생..

 

👻 문제점 & 원인

원인은 역시 split을 이용해 String 배열로 변환한 뒤 사용한 것,

문자열에 charAt()을 이용해 바로 접근하거나 문자열.toCharArray() 를 사용하여 char배열로 접근하니

효율성 문제가 해결되었다.

 

이는 split을 이용할 경우 배열화 하고자 하는 문자열의 길이만큼의 크기가 필요해지며

이때 String [] 배열을 생성하고 초기화하는데 시간이 걸리게 된다. 이 시간은 문자열의 길이만큼 

늘어난다. 또한 split 메서드로 전달되는 regex 파라미터로 매번 문자열을 검사하여 분리하기 때문에

더욱 시간이 오래걸리는 것이다.

 

toCharArray도 배열로 변환하는 것은 마찬가지 아니냐고 할 수 있는데 아무래도 regex검사 없이

문자열의 각 요소를 바로바로 문자로 가져와 배열에 담기 때문에 시간적인 측면에서 효율적인듯하다.

효율성은 charAt > toCharArray >>>>>>>> split 인 것 같다.

 

✅깨달음

코테에서는 아무래도 시간 복잡도를 줄이면 줄일 수록 이득이기 때문에 문자열의 각 요소에 접근할 땐

charAt을 사용하도록 해야겠다.

 

🚨CODE

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        int size = 0;
        
        for(int i = 0; i<s.length(); i++){
            if(s.charAt(i) == '('){
                size++;
            }else{
                size--;
            }
            
            if(size < 0)
                return false;
        }
        
        if(size != 0)
            return false;
        
        return answer;
    }
}

 

 

728x90
반응형