Valid Parentheses


설명

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.


풀이

스택을 이용해서 풀었다. 열린 괄호와 닫힌 괄호의 쌍을 맞추어주면 되기 때문에 그것만 유의해주면 풀 수 있었다. 


따로 자바 API에 내장된 스택 라이브러리를 쓰지 않고 직접 해당 Solution 클래스의 내부 클래스로 스택을 만들어서 풀어보았다.


Runtime : 12ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
    public boolean isValid(String s) {
        Stack stack = new Stack();
        char openParenthness[] = {'(''[''{'};
        char closeParenthness[] = {')'']''}'};
        
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            
            for(int bIndex = 0; bIndex < 3; bIndex++){
                if(c == openParenthness[bIndex])
                    stack.push(c);
                if(c == closeParenthness[bIndex]){
                    if(stack.size() == 0)
                        return false;
                    
                    char openChar = stack.pop();
                    
                    if(!(openChar == '(' && c == ')' || openChar == '[' && c == ']' || openChar == '{' && c == '}'))
                        return false;
                }
            }
        }
        if(stack.size() >= 1)
            return false;
        
        return true;
    }
    
    class Stack{
        char[]array;
        int capacity;
        int size;
        
        Stack(){
            size = 0;
            capacity = 10;
            array = new char[capacity];
        }
        
        void push(char c){
            if(size < capacity){
                array[size++= c;
                return;
            }
            
            // size >= 10
            resize();
            array[size++= c;
        }
        
        void resize(){
            capacity = capacity + (capacity >> 1);
            array = Arrays.copyOf(array, capacity);
        }
        
        char pop(){
            if(size <= 0){
                System.out.println("배열 음수 값 반환");
                System.exit(1);
            }
            
            return array[--size];
        }
        
        int size(){
            return size;
        }
    }
}
cs


Runtimes : 8ms

스택은 동일하게 구현했고 내부 내용을 약간 수정하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public boolean isValid(String s) {
    Stack stack = new Stack();
    
    for(int i = 0; i < s.length(); i++){
        char c = s.charAt(i);
        
        switch(c){
        // 열린 괄호
        case'(':
            stack.push(c);
            break;
        case'[':
            stack.push(c);
            break;
        case'{':
            stack.push(c);
            break;
        // 닫힌 괄호
        default:
            if(stack.size() <= 0
                return false;
            
            char anotherC = stack.pop();
            
            if(anotherC == '(' && c == ')'break;
            if(anotherC == '[' && c == ']'break;
            if(anotherC == '{' && c == '}'break;
            
            return false;
        }
    }
    
    if(stack.size() >= 1)
        return false;
    
    return true;
}
cs


Posted by doubler
,