devFancy BE Developer

[Programmers] 12909. 올바른 괄호

2023-02-04
devfancy

문제 링크

성능 요약

  • 메모리: 52.8 MB, 시간: 19.78 ms - Answer Code1

  • 메모리: 53.1 MB, 시간: 7.90 ms - Answer Code2

구분

코딩테스트 연습 > 스택/큐

Answer Code1(23.02.04)

import java.util.*;

class Solution {
    boolean solution(String s) {
        // [1] 정답을 저장할 변수로 answer와 stack을 선언
        boolean answer = true;
        Stack <Character> stack = new Stack<>();

        // 반복문을 이용하여 문자열을 앞에서부터 비교
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            // [2] 문자를 비교할 때 `(` 일 경우 스택에 push 
            if(c == '(') {
                stack.push(c);
            }
            
            // [3] `)`일 경우
            if( c == ')') {
                // stack의 크기가 0이면 false 반환
                if(stack.size() == 0) {
                    answer = false;
                }
                // stack의 크기가 0이 아니라면  `(`가 있다는 의미이므로 스택에 pop
                else {
                    stack.pop();
                }
            }
        }
        // [4] 문자열을 끝까지 확인한 이후에 스택의 크기가 0이면 true 반환
        if(stack.size() != 0) {
            answer = false;
        }
        
        return answer;
    }
}

Answer Code1 - 문제 풀이

  • 스택을 이용하여 괄호가 짝을 이룬다면 스택을 제거한다.

  • 문자열을 끝까지 검사했을 때 스택의 크기가 0이면 올바른 괄호이므로 true를 반환하고, 그렇지 않으면 false를 반환한다.

  • [1] 정답을 저장할 변수로 answer와 stack을 선언하고, 반복문을 이용하여 문자열을 앞에서부터 비교한다.

  • [2] 문자를 비교할 때 ( 일 경우 스택에 push 한다.

  • [3] )일 경우 이때, stack의 크기가 0이 아니라면 스택에 pop 한다.

    • stack의 크기가 0이 아니라면 (가 있다는 의미이고, 스택의 크기가 0이라면 (가 없으므로 짝을 이룰 수 없다.
  • [4] 문자열을 끝까지 확인한 이후에 스택의 크기가 0이면 true, 아니면 false를 return 한다.

Answer Code2(23.02.04)

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

        return answer;
    }
}

Review

  • (2번째 풀이) 다른 사람의 풀이를 가져와봤는데, 스택을 사용안하면서 count 변수를 사용하여 깔끔하게 풀이했다.

  • 그 결과 1번째 풀이보다 시간적인 측면에서 3배 가까이 시간을 절약하는 것을 볼 수 있었다.

  • 스택을 사용한다고 해서 좋은 정답은 아니라는 것을 알 수 있었다.


Comments

Index