시작에 앞서 본인은 코딩 테스트는 거의 보지 않았기에, (해봐도 프로그래머스로 연습문제 몇개 정도였다.)
어떤 방식으로 답안을 제출해야 하는지 부터 확인해야 했다.
백준은 입력값을 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에서 따로 돌려보니, 문제는 두가지였다.
split()
의 기본값을 고려하지 않음
split의 기본값이 공백
인데, 공백 없이 입력되는 문자열을 받으니 list에 들어갈 리가 없었다.
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')
허무하게도 한번에 통과했다.
다사다난 첫 파이썬 백준 문제 풀이였다. 두번째 부터는 좀 잘 할수 있기를.
문제를 잘 읽는것이 시작의 반 이상이라는 걸 깨닫는다.