프로그래머스 - 올바른 괄호(스택)

연수·2024년 2월 19일

코딩테스트

목록 보기
7/10

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

💡 나의 코드

# test case만 통과 
def solution(s):
    answer = True
    
    data = list(s)
    answer_list = []
    
    for d in data:
        if len(answer_list)==0 and d == ')':
            return False
        elif len(answer_list)==0 or d == '(':
            answer_list.append(d)
            data.pop()
        elif answer_list[-1] == '(' and d == ')':
            data.pop()
            answer_list.pop(-1)
            
    if len(answer_list)>=2:
        return False
    else:
        return True

나올 수 있는 경우의 수를 모두 고려해가면서 작성했다고 했지만 여전히 예외처리가 부족했던 코드였던 것 같다. 결과적으로 테스트 케이스만 통과하고 실제 제출에서 대부분을 실패했다.

# 두번째 코드
# 최종적으로 2개 실패
def solution(s):
    answer = True
    
    answer_list = []
    
    for d in s:
        if len(answer_list) == 0 and d == ')':
            return False
        elif len(answer_list) == 0:
            answer_list.append(d)
            answer = False
        elif answer_list[-1] != d:
            answer = True 
            answer_list.pop()
        else:
            answer_list.append(d)
            answer = False
    return answer

첫번째 코드를 보다보니 쓸데없이 들어가있는 부분이 많아 그 부분들을 수정했다.
또한 아직 스택에 대한 이해가 부족해 잘못 생각하고 있던 부분들도 다수 존재했다.

  1. for문을 활용해 데이터를 반복할 땐 for문 내에서 .pop()을 하더라도 바로 적용된 데이터에서 반복문이 돌아가는건 아니다. ➡️ 리스트가 아닌 기존 입력인 문자열로 반복문 돌려도 가능하다. 그리고 적용되지 않으니 기존 데이터에 적용하는 pop()은 필요가 없다.
  2. 스택은 후입선출의 방식을 갖고 있기에 pop()을 진행하면 가장 마지막 데이터가 추출된다. ➡️ pop(-1)일 필요가 없다.

위 코드로 모든 경우를 다 예외처리 했다고 생각했지만 결과적으로 2개 실패 ..
하지만 이내 가장 큰 문제점을 찾았다.
최대한 간결하고 깔끔한 코드를 작성하는게 목표지만 현재 보이는 코드들은 모두 경우의 수를 일일이 작성하는 경향이 있어 코드가 간결하지 못하다.

# 통과 
def solution(s):
    
    answer_list = []
    
    for d in s:
        if d == '(':
            answer_list.append(d)
        else:
            if answer_list:
                answer_list.pop()
            else:
                return False
    if answer_list:
        return False
    
    return True

위 코드가 내가 생각했던 방식을 가장 간결하게 정리한 코드이다.
이렇게 간결하게 적을 수 있는데 너무 모든 경우의 수를 적을려고 한 잘못인 것 같다

앞으로 내가 생각한 모든 경우의 수를 정리한 다음 최대한 간결하게 코드를 작성하려는 노력이 많이 필요할 것 같다!

profile
하고 싶은건 다 하자 👻

0개의 댓글