본문 바로가기
JAVA/Coding Test Study

[Easy] LeetCode - no.20 Valid Parentheses : Java

by ♡˖GYURI˖♡ 2024. 10. 19.
728x90

https://leetcode.com/problems/valid-parentheses/description/?envType=study-plan-v2&envId=top-interview-150

 

 

문제

(, ), {, }, [, ] 로 이루어진 String s가 유효한지 판단할 것

이 때, 유효하다는 것은 열리는 괄호와 닫히는 괄호가 서로 매칭되는지 여부

Example 2:
Input: s = "()[]{}"
Output: true

Example 3:
Input: s = "(]"
Output: false

 

 

 

풀이1

    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
                continue;
            }
            if (c == ')') {
                if (!stack.isEmpty() && stack.peek() == '(') {
                    stack.pop();
                } else {
                    return false;
                }
            } else if ( c == '}') {
                if (!stack.isEmpty() && stack.peek() == '{') {
                    stack.pop();
                } else {
                    return false;
                }
            } else {
                if (!stack.isEmpty() && stack.peek() == '[') {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
  • Stack 사용
  • s를 char 배열로 하나씩 순회
    • c가 열림 괄호 중 하나라면 stack.push() 후 continue
    • c가 ) 라면 stack이 비어있지 않고, stack.peek()이 ( 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
    • c가 } 라면 stack이 비어있지 않고, stack.peek()이 { 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
    • c가 ] 라면 stack이 비어있지 않고, stack.peek()이 [ 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
  • stack.isEmpty() 반환 : 비어있지 않으면 false, 비어있으면 true
  • 시간복잡도 : O(N)

 

 

풀이2

    public static boolean isValid2(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                char top = stack.peek();
                if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
  • 풀이1과 로직은 동일
  • 조건문을 좀 더 다듬은 것