프로그래밍/코딩테스트

프로그래머스 L2: 올바른 괄호

카멜필름 2025. 8. 23. 12:22

문제 설명

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

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

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

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

입출력 예sanswer
"()()" true
"(())()" true
")()(" false
"(()(" false
입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

 

 

내가 쓴 정답 코드

def solution(s):
    stack = []
    for i in s:
        if i == ')' and not stack:
            return False
        elif i == '(':
            stack.append(i)
        else:
            stack.pop()
    if not stack:
        return True
    else:
        return False

 

 

사고 흐름 과정 분석

잘못된 사고 흐름들:

1. 문자열 순회 방식의 혼동

for i in s:  # i는 문자
    s[i+1]   # 문자를 인덱스로 쓰려 함
  • 실수: for i in s와 for i in range(len(s))를 구분 못함
# 방법 1: 인덱스가 필요할 때
for i in range(len(s)):
    current = s[i]
    if i+1 < len(s):  # 범위 체크 중요!
        next_char = s[i+1]

# 방법 2: 값과 인덱스 둘 다 필요할 때  
for i, char in enumerate(s):
    if i+1 < len(s):
        next_char = s[i+1]

# 방법 3: 값만 필요할 때 (대부분)
for char in s:
    # char 사용

2. 예외 케이스부터 생각

  • 처음에 if i == ')': return False 이렇게 시작
  • 문제: 정상적인 플로우를 먼저 설계하지 않고 예외부터 막으려 함
  • 올바른 순서: 기본 로직 → 예외 처리

3. 스택의 목적 불분명

  • 스택에 뭘 넣을지, 언제 뺄지 명확하지 않았음
  • 모든 문자를 다 넣고 나서 빼려고 함

다음에 개선할 점들:

1. 문제 해결 순서

 
❌ 지금: 코딩부터 시작 → 에러 → 수정
✅ 개선: 손으로 시뮬레이션 → 로직 정리 → 코딩

2. 간단한 테스트케이스로 확인

  • "()", ")(", "(((" 같은 간단한 케이스로 손으로 따라가보기
  • 각 단계에서 스택이 어떻게 변하는지 그려보기

3. 자료구조 선택 이유 명확히

  • "왜 스택을 쓰지?" → "나중에 온 것부터 처리하니까"
  • 목적이 불분명하면 카운터 같은 더 간단한 방법 고려

4. 기본 문법 체크리스트

  • for i in 리스트 vs for i in range(len(리스트))
  • 문자열 vs 숫자 연산
  • 이런 기본기는 확실히 해두기

 

 

다른 사람 풀이

 

def is_pair(s):
    st = list()
    for c in s:
        if c == '(':
            st.append(c)

        if c == ')':
            try:
                st.pop()
            except IndexError:
                return False

    return len(st) == 0


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( is_pair("(hello)()"))
print( is_pair("()()()"))
728x90
LIST