[프로그래머스] 올바른 괄호 (Java)
알고리즘/프로그래머스

[프로그래머스] 올바른 괄호 (Java)

반응형

프로그래머스 Level 2 올바른 괄호 (자바)

 

 

출처

programmers.co.kr/learn/courses/30/lessons/12909

 

코딩테스트 연습 - 올바른 괄호

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 ()() 또는 (())() 는 올바른 괄호입니다. )()( 또는 (()( 는 올바르지 않은 괄호

programmers.co.kr

 

 

 

문제

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • ()() 또는 (())() 는 올바른 괄호입니다.
  • )()( 또는 (()( 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

 

 

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

 

 

입출력 예

입출력 예 1

 

 

 

걸린 시간

까먹고 시간을 안 쟀다... 한 30분?? 쯤 걸렸다!

 

 

 

접근 방법

전에 봤던 코딩테스트에서 비슷한 문제가 나온 적이 있어 오랜만에 관련 문제를 풀어보았다.

(그때 못풀었다는게 함정...)

 

처음 접근한 방법은 '(' 다음에 바로')'가 안 오면 false를 반환하도록 했는데 2번째 예시를 보면 어림도 없는 생각이었다.

 

그래서 '('를 만날때마다 스택에 push 하고, ')'를 만났을 때 pop 하도록 했다.

'('을 만났는데 스택이 비어있다... 이것은 '('개수가 부족한 것이므로 false를 반환한다.

 

 

 

내 코드

import java.util.*;

class Solution {
    boolean solution(String s) {
        if (s == null || s.charAt(0) == ')' || s.charAt(s.length()-1) == '(' || s.length()%2 != 0) {
                //예외처리
                return false;
            }

            Stack<Character> stack = new Stack<>();

            for (char c : s.toCharArray()) {
                if (c == '(') {
                    stack.push(')');
                } else {
                    if (stack.isEmpty()) {
                        return false;
                    } else {
                        stack.pop();
                    }
                }
            }

            return stack.isEmpty();
    }
}

 

 

 

 

고려할 점

1. 스택을 사용할 것

2. '('와 ')'을 어떻게 연관시킬지 생각할 것

 

 

 

반응형