백준 4949. 균형잡힌 세상

·2021년 3월 6일
0

알고리즘

목록 보기
5/20

문제 링크

반례 때문에 틀린 문제, 앞으로는 문제를 읽으면서 관용적으로 인정해버리지 말자. 꼼꼼하고 깐깐하게 if else문 쓰기.

TRYS AND INSIGHTS

[1번 시도]

  • T의 마지막 문자열='.'이길래 '.' 이 유일무이할 거라고 생각해서 for문의 break조건으로 "."을 걸어뒀다.
  • 하지만 조금만 더 생각해보면 얼마던지 한 문장에 .이 들어갈 수 있다..

<반례>

Hello [I am] (working) on this 4949.p(y.

즉, AAA.BB. 의 형태에서 .을 기준으로 종료해버리면 BB의 문자열이 균형잡히지 않은 경우를 NO로 체크하기 힘들다.

[2번 시도]

  • for문의 형태를 바꿔서 T의 길이와 현재 인덱스 위치를 비교하는 방식으로 for문의 break조건을 걸어둠
  • 이렇게 해야 문장 끝까지 다 검사한 후 이상이 다 없으면 yes를 answers 리스트에 추가해 줌.

ANSWER


stack = []

def main():
    global stack
    answers = []
    while(True):
        T = input()
        if T == ".": break  # 종료 조건
        for i in range(len(T)):
            if T[i] in ['(', '[']:
                # T의 i번째 문자가 여는 괄호일 경우, 스택에 추가만 하기
                stack.append(T[i])
            elif T[i] in [')', ']']:
                # T의 i번째 문자가 닫는 괄호일 경우, 스택의 top과 비교해서 맞물리지 않으면 NO
                ans = close(T[i])
                if not ans:
                    answers.append('no')
                    break
            if i == len(T)-1 and len(stack)==0:
                # T를 끝까지 하고 스택이 깨끗하면 YES
                answers.append('yes')
            elif i == len(T)-1 and len(stack)!=0:
                # T가 끝까지 되었는데 스택에 뭐가 잔여해 있으면 NO
                answers.append('no')
            
        stack = []
    
    for ans in answers:
        print(ans)
        

def close(c):
    global stack
    matches = {')':'(', ']':'['}
    if len(stack) != 0:
        top = stack.pop()
        if top == matches[c]:
            return True
        else:
            return False
    else:
        return False


main()
profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글