[문제 링크] 👇
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 방법
1️⃣ ")" 를 만날 때 까지 "(" 를 큐에 넣는다.
queue.append(n)
2️⃣ ")" 를 만나면 큐의 맨 뒤에서부터 "(" 를 꺼낸다.
- 단, "(" 를 꺼내기 전에 큐가 비어있지 않은지 확인한다. 큐가 비어있으면 꺼내려고 할 때 에러가 난다.
- 큐가 비어있지 않으면 꺼내고 비어있으면 반복문을 중단시킨다.
- 처음부터 ")" 를 만나면 문자열을 끝까지 확인해도 올바르게 짝지어지지 않기 때문이다.
 
queue.pop()
3️⃣ 큐가 비어있지 않으면 False를 반환하고, 비어있으면 True를 반환한다.
★ True 예시

큐가 비어있으므로 True 를 반환한다.
★ False 예시

큐가 비어있지 않으므로 False 를 반환한다.
Solution
from collections import deque
def solution(s):
    answer = True
    queue = deque()  # 비어있는 큐 생성
    for i in s:
        if i == "(":
            queue.append(i)  # 뒤에서부터 넣기
        else:
            if len(queue) != 0:  # 큐가 비어있지 않으면
                queue.pop()  # 맨 뒤에서부터 꺼내기
            else:  # 큐가 비어있으면
                queue.append(i)
                break
    if len(queue) > 0:  # 큐가 비어있지 않으면 올바르게 짝지어지지 않았다는 것
        answer = False
    return answer
개선할 점
- 이 코드에서 큐(deque)를 사용해 괄호가 올바르게 짝지어졌는지 확인하는 방식은 잘 작동하지만, 큐 대신 list를 사용하는 편이 간단하다.
- deque의 장점인 양방향 추가/삭제가 필요하지 않으므로, list로도 충분히 처리할 수 있다.
- 또한, 코드에서 answer 변수를 미리 True로 정의하는 대신, 마지막에 조건을 직접 반환하면 코드가 더 간결해진다.
- 이렇게 개선하면 길이가 100,000까지 되는 s 문자열도 효율적으로 처리할 수 있다.
개선된 코드
def solution(s):
    stack = []
    for char in s:
        if char == "(":
            stack.append(char)  # 열린 괄호는 스택에 추가
        else:
            if stack:  # 스택이 비어있지 않으면
                stack.pop()  # 스택에서 열린 괄호 하나 제거
            else:
                return False  # 닫힌 괄호가 더 많아지는 경우 False 반환
    return len(stack) == 0  # 스택이 비어있어야 올바른 괄호
'프로그래머스 코딩테스트 > Level 2' 카테고리의 다른 글
| [Programmers] L2. JadenCase 문자열 만들기 (Python) (0) | 2024.11.08 | 
|---|---|
| [Programmers] L2. 최솟값 만들기 (Python) (0) | 2024.11.08 | 
| Programmers 다음 큰 숫자 (Python/Level 2) (0) | 2022.08.13 | 
| Programmers 최댓값과 최솟값 (Python/Level 2) (0) | 2022.08.12 | 
| Programmers 행렬의 곱셈 (Python/Level 2) (0) | 2022.08.11 |