코딩 테스트/99클럽

[99클럽] 코테 스터디 3일차 TIL - Stack

토자맨 2024. 5. 23. 21:48

문제

문제 설명

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

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

제한사항

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

입출력 예

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

풀이 방법 두 가지

처음엔 스택을 떠올리지 못해서 counting 하는 방법으로 문제를 해결했다.

  • 해결 방법
    1. '('가 나오면 count++
    2. ')'가 나오면 count--
      이때 실패 조건 두 가지
    • count가 0인데 ')'가 나오는 경우
    • 문자열의 끝까지 돌았는데 count > 0인 경우

Stack 이용하지 않고 개수를 세서 해결한 풀이


/**
 스택이 아닌 개수를 세는 방식으로 푸는 방법
 1. '('가 나오면 count++
 2. ')'가 나오면 count--
 이때 실패 조건 두 가지
 -  count가 0인데 ')'가 나오는 경우
 -  문자열의 끝까지 돌았는데 count > 0인 경우
 **/
class Solution {
    boolean solution(String s) {
        boolean answer = true;
        int n = 0;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                n++;
            }
            else {
                if (n == 0) {
                    answer = false;
                    break;
                }
                n--;
            }
        }
        if (n > 0) {
            answer = false;
        }
        return answer;

    }
}

Stack을 이용한 풀이

import java.util.Stack;
/**
 스택을 이용한 풀이
 1. '('가 나오면 stack에 push
 2. ')'가 나오면 stack을 pop
 이때 실패하는 경우 2가지
 - 모든 String을 돌았는데도 stack이 비어있지 않은 경우
 - stack이 비어 있는데 ')'가 나온 경우
 **/
class Solution2 {
    boolean solution(String s) {
        boolean answer = true;
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                stack.push(ch);
            }
            else {
                if (stack.isEmpty()) {
                    answer = false;
                    break;
                }
                stack.pop();
            }
        }
        if (!stack.isEmpty()) {
            answer = false;
        }
        return answer;
    }
}

오늘 회고

새롭게 깨달은 내용

워낙 쉬운 문제이고 전에 풀어본 문제라 새롭게 알거나 어려웠던 부분은 없다.

내일 공부할 것

  • 프레임워크 프로그래밍 프로젝트 과제 백엔드 구현 완료
  • 일본어 4과 복습 및 히라가나 복습
  • 99클럽 4일차 코테 문제 풀이 및 TIL 작성