상세 컨텐츠

본문 제목

[프로그래머스] Lv.2 - 올바른 괄호

알고리즘/프로그래머스

by 으노로 2023. 3. 3. 01:16

본문

안녕하세요.

오늘은 프로그래머스의 코딩테스트 lv.2 단계 중에 올바른 괄호 공부해보겠습니다.

언어는 Java로 구현하였습니다.

 

문제 설명

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

예를 들어

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

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

 

제한 사항

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

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

문제 풀이

올바른 괄호인지 확인하기 위해 몇 가지 조건을 만들었습니다.

  • 첫 번째 괄호는 '(', 마지막 괄호는 ')' 이어야 한다.
  • '('의 개수만큼 ')'가 존재해야 한다.
  • ')'의 개수가 더 많지 않아야 한다.

매개변수 s가 올바른 괄호인지 확인하기 위해 반복문을 통해 한 글자씩 가져와서 확인하였습니다.

조건을 맞추기 위한 int 변수(num)를 선언하고 가지고 온 글자가 '('이면 num을 증가시키고 ')'이면 num을 감소시켰습니다.

num이 0이면 '('가 있어야 하고 num이 0보다 작으면 올바른 괄호가 아닌 것으로 판단하였습니다.

  1. 조건을 확인하기 위한 int 변수(num)를 선언한다.
  2. 반복문을 통해 매개변수 s를 한글자씩 가지고 온다.
  3. num이 0이면 가지고 온 글자가 '(' 이면 num을 증가시키고 ')' 이면 false를 반환한다.
  4. num이 0보다 크면 가지고 온 글자가 '(' 이면 num을 증가시키고 ')' 이면 num을 감소시킨다.
  5. num이 0보다 작으면 false를 반환한다.
  6. 반복문이 끝나면 num을 확인하여 0이면 true, 0이 아니면 false를 반환한다.
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
class Solution {
    boolean solution(String s) {
        int num = 0;
 
        for(int i = 0; i < s.length(); i++)
        {
            if(num == 0)
            {
                if(s.charAt(i) == '(')
                {
                    num++;
                }
                else
                {
                    return false;
                }
            }
            else if(0 < num)
            {
                if(s.charAt(i) == '(')
                {
                    num++;
                }
                else
                {
                    num—;
                }
            }
            else
            {                
                return false;
            }
        }
        
        boolean answer = (num == 0) ? true : false;
 
        return answer;
    }
}

 

추가 풀이

위와 같은 방법으로 구현하고 난 뒤에 Stack을 공부하였는데 Stack을 활용하면 더욱 간편하게 해결이 가능할 것 같아서 Stack을 사용한 방법으로도 구현하였습니다.

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
import java.util.Stack;
 
class Solution {
    boolean solution(String s) {
        Stack<Character> stack = new Stack<Character>();
        
        try
        {
            for(int i = 0; i < s.length(); i++)
            {
                if(s.charAt(i) == '(')
                {
                    stack.push('(');
                }
                else
                {
                    stack.pop();
                }
            }
            
            return stack.empty();
        }
        catch(Exception e)
        {
            return false;
        }
    }
}

Stack을 선언하고 반복문을 통해 매개변수 s를 한 글자씩 가져와서 '('이면 stack에 추가하고 ')'이면 스택의 최상단을 제거하였습니다. 반복문이 끝난 뒤에 empty() 함수로 스택에 값을 확인하여 없다면 true, 있다면 false를 반환하였습니다.

그리고 스택에 값이 없는데 최상단을 제거하면 에러가 발생하기 때문에 try-catch로 에러 시에 false를 반환하였습니다.


사용 함수

  • push()
    • 입력된 값을 Stack에 추가하는 함수
  • pop()
    • Stack의 최상단 값을 제거하는 함수
  • empty()
    • Stack이 비어있는지 확인하는 함수(비어있다면 true, 값이 있다면 false)

 

마무리 정리

문제가 요구하는 것을 이해하고 그에 맞도록 조건을 설정하는 데 시간이 많이 소요되었습니다.

설정한 조건을 구현하기 위해서 반복문과 조건문을 사용하였는데 Stack을 사용하니 이전보다 훨씬 간단하게 구현할 수 있었습니다.

이상으로 프로그래머스 Lv.2 - 올바른 괄호 공부를 마치겠습니다.

감사합니다.

관련글 더보기

댓글 영역