백준 9012 : 괄호 (파이썬)

Summu·2023년 4월 20일
0

코테 문제 풀이

목록 보기
1/2
post-thumbnail

시작에 앞서 본인은 코딩 테스트는 거의 보지 않았기에, (해봐도 프로그래머스로 연습문제 몇개 정도였다.)
어떤 방식으로 답안을 제출해야 하는지 부터 확인해야 했다.

백준은 입력값을 split하는 방식으로 구분하고, 결과값을 print로 출력하는 방식인 것 같았다.

문제 링크

먼저 첫 코드

str = input().split()
parenthesis_cnt = 0 # 괄호 쌍 개수

for s in str:
    if s == '(':
        parenthesis_cnt += 1
        
    elif s == ')':
        parenthesis_cnt -= 1
        
    else:
        parenthesis_cnt = -1
        break
        
print('NO' if parenthesis_cnt < 0 else 'YES')

프로그래머스처럼 출력값을 따로 볼 수 없었기에 더 어렵게 느껴졌다.
예시 출력값들을 위의 로직에 맞춰 숫자를 계산해봤다.

(())()) NO : -1 [-1]에서 break
(((()())() NO : 2
(()())((())) YES : 0
((()()(()))(((())))() NO : 1
()()()()(()()())() YES : 0
(()((())()( NO : 3
(( NO : 2
)) NO : [0]에서 break
())(() NO : [2]에서 break

위에 적은 코드들은 닫는 괄호 ) 만 필터링하지, 여는 괄호 (가 더 많은 경우는 필터링하지 않는다는 것을 깨달았다.

그래서 맨 마지막 구문을 아래와 같이 고쳐줬는데...

print('NO' if parenthesis_cnt != 0 else 'YES')


처참히 실패. 그래서 아예 stack으로 구현해봤다.

str = input().split()
li = [ ]

for s in str:
    try:
        if s == '(':
            li.append(s)
        elif s == ')':
            li.pop(-1)
    except:
        print('NO')
        break

print('NO' if len(li) > 0 else 'YES')

코드가 짧아진 만큼 빨간 실패 글자도 더 빠르게 나타났다.
답답해진 나머지 IDE에서 따로 돌려보니, 문제는 두가지였다.

  1. split()의 기본값을 고려하지 않음
    split의 기본값이 공백 인데, 공백 없이 입력되는 문자열을 받으니 list에 들어갈 리가 없었다.

  2. try 문의 위치
    어찌 저찌 split이 실행 됐다 해도, for문 안에서 IndexError를 잡고, NO를 출력한 뒤에
    if문이 들어간 print 함수를 실행해 총 두 번 출력했다.

그렇게 다시 고쳐진 코드.

li = [ ]    
str = input()[::1]

try:
    for s in str:
        if s == '(':
            li.append(s)
        elif s == ')':
            li.pop(-1)
    print('YES' if len(li) == 0 else 'NO')
except IndexError:
    print('NO')


예시로 나온 문자열들을 넣어보니 이번엔 꽤 성공적이였다. 그러나 이번에도 실패해, 최종병기 구글링을 꺼냈다.

.. 알고보니 예시 입력에 나온것들은 따로 따로 입력되는 것이 아니라 한번에 입력되는 것이였고
입력된 문자열 중 젤 처음의 정수, T 개의 문자열이 들어온다고 했다.
문제 자체를 잘못 이해한 것이였다!

이해한 대로 코드를 고쳐줬다.

for i in range(0, int(input())):
    li = [ ]
    str = input()[::1]

    try:
        for s in str:
            if s == '(':
                li.append(s)
            elif s == ')':
                li.pop()
        print('YES' if len(li) == 0 else 'NO')
    except IndexError:
        print('NO')

허무하게도 한번에 통과했다.
다사다난 첫 파이썬 백준 문제 풀이였다. 두번째 부터는 좀 잘 할수 있기를.

문제를 잘 읽는것이 시작의 반 이상이라는 걸 깨닫는다.

profile
퇴사한 햇병아리 웹 개발자, 타직무로 이직을 꿈꾸다?!

0개의 댓글