말하는 컴공감자의 텃밭

프로그래머스 올바른괄호 <2점> - 자바(java) Stack 본문

알고리즘/Programmers - Java

프로그래머스 올바른괄호 <2점> - 자바(java) Stack

현콩 2023. 6. 27. 12:31
728x90

프로그래머스 올바른괄호
쉽다쉬워

 

스택의 기본인 괄호검사이고, '( )' 만 다루기에 문제가 간단해서 금방 푼 문제였다.

다만 효율성에서 걸려서 해결이 안됐었다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
 
class Solution {
    boolean solution(String s) {
        Stack<Integer> stack = new Stack<>();
 
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
 
            if (c == '(') {
                stack.push(i);
            } else if (c == ')') {
                if (!stack.isEmpty() && s.charAt(stack.peek()) == '(') { // 비어있지 않고, 최상단이 ( 일때
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
 
        return stack.isEmpty(); // 비어있지 않다면 false
    }
}
 
cs

기존 코드이다.

 

아오

아쉽게도 효율성에서 떨어져서 더 고민하게 되었다.

 

스택을 사용하지 않고, if문을 줄여보자 라고 생각했고

Count + -로 괄호의 갯수를 맞추고, 빼는 타이밍에는 +가 있는상태인지 확인하고 빼는 방식을 고려하게 되었다.

그렇지 않으면 '( ) ) ( ( )' 와 같은 상황에서도 + - 가 일치해서 0이면 올바르다고 나올테니깡

물론 [ { ( ) } ] 모두 등장하는 문제면 스택이 편할듯 싶다.

 

필요없는 answer 변수도 제거했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    boolean solution(String s) {
        int count = 0;
 
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
 
            if (c == '(') {
                count++;
            } else if (c == ')' && count > 0) { // count가 이미 있는지 체크
                count--;
            } else {
                return false// 
            }
        }
        return count == 0// count가 0이면 true
    }
}
cs
728x90
Comments