Coding Test/Programmers

[Lv.2] 올바른 괄호 [프로그래머스_코딩테스트] [스택, 문자열] [30분]

whawoo 2025. 6. 23. 03:52
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

여는 괄호와 닫는 괄호로 이루어진 문자열 s가 있을 때 열고 닫는 것은 항상 짝을 이루어야 한다는 규칙이 있다고 한다. 이 때 바르게 짝지어진 경우면 true 아니면 false를 반환하는 문제

🧠 나의 접근 방식과 시행착오

한 6분 걸린 문제. 기존에도 비슷한 문제를 풀어본 기억이 있었던 단골 유형 문제라 기억하고 있는 것을 활용하여 빠르게 해결하였다. 짝을 이루어야 한다는 점에서 간단하게 스택에 넣고 빼는 형태로 풀었다.

/// <summary>
/// 올바른 괄호
/// https://school.programmers.co.kr/learn/courses/30/lessons/12909
/// </summary>
public bool solution(string s)
{
    // (를 쌓다가 )로 뺄때 )가 더 많이 나오면 안됨
    Stack<char> openStack = new Stack<char>();

    foreach (var c in s)
    {
        if (c == ')')
        {
            if (openStack.Count == 0)
            {
                return false;
            }

            openStack.Pop();
        }
        else if (c == '(')
        {
            openStack.Push(c);
        }
    }

    return openStack.Count == 0;
}

✅ 풀이 코드

가독성을 고려한 케이스 하나와 Stack을 쓰지 못하는 상황일 때의 문제 해결법을 피드백으로 주었다. (문제에서는 (와 )만 존재하기 때문에 개수로 구별해도 가능) 확장성을 고려한다면 Stack이 더 낫긴 하다.

foreach (var c in s)
{
    if (c == '(')
    {
        openStack.Push(c);
    }
    else // c == ')'
    {
        if (openStack.Count == 0) return false;
        openStack.Pop();
    }
}
int count = 0;
foreach (var c in s)
{
    count += (c == '(') ? 1 : -1;
    if (count < 0) return false; // ')'가 먼저 나올 경우
}
return count == 0;

🔄 정리

operator 처리 등의 문제를 다루다 보면 자주 나오는 문제이기에 한번 풀어보면 다음에는 쉽게 풀 수 있는 유형이긴 하다. Stack을 쓰는 것도 잘 다루면 다른 문제들에서도 유용히 쓸 수 있다.

반응형