간단해 보이는 괄호 문제이다. 어디서 본 적이 있는 듯한 문제인데 기억이 안난다(백준에서 본 것 같기도 하고...)
시간 초과가 뜬 풀이
처음에는 while문
으로 풀었는데 효율성 테스트 1,2번에서 계속 시간초과가 뜬다.
def solution(s):
while True:
temp = s
s = s.replace('()', '')
if s == '':
return True
if temp == s:
return False
아마도 while문
때문에 그런듯 하다. 원래 이 코드의 취지는, s
문자열 안에 있는 ()
를 빈 문자열로 대체해주고, 미리 정의 해놨던 temp
와 s
가 같으면 그 뜻은 while문
안에서 더 이상 ()
이 발견이 안된다는 뜻인데, 이 때 temp
랑 s
가 같으면 지속적으로 while문
이 실행되었다는 뜻이므로 False
를, 아니고 s
가 빈 문자열이 된다면 True
를 되돌려주게 하려 했다. 하지만 이는 시간 초과가 떴으므로 다른 방법이 필요했다.
정답
def solution(s):
if s.count('(') != s.count(')'):
return False
s = s.replace('()', '')
if len(s) == 0:
return True
if s[0] == ')' or s[-1] == '(':
return False
return True
이번에는 while문
을 사용하지 않고 하는 방법을 강구해야 했다:
- 만약 '(' 과 ')'의 개수가 같지 않다면 틀린것이므로,
False
를 되돌려준다. s = s.replace('()', '')
를 해주고,len(s) == 0
이라면 바로True를 되돌려준다. 이는 예를 들면
()()와 같은 문자열을 실행시켰을 때 바로
True`를 되돌려준다.s = s.replace('()', '')
를 실행시킨 뒤에 마지막s[0] == ')' or s[-1] == '('
을 실행시켜준다. 예를 들면'())(()'
같은 경우는 1번의 경우를 만족하고, 2번처럼s = s.replace('()', '')
를 실행시키지 않고 바로 3번을 실행시켜준다면True
를 반환할 것이므로, 2번을 실행시켜주고 3번을 실행해야 한다. 2번을 실행하면'())(()'
는')('
가 된다.- 마지막에는 이를 모두 통과했다면 옳은 괄호이므로,
True
를 반환한다.
이 문제는 오히려 반례를 찾느라 힘들었다. 내 코드에 대한 반례를 찾을 수 있으면 빠르게 풀리는 문제였다.
'알고리즘 테스트 > 프로그래머스 문제풀이 및 해설' 카테고리의 다른 글
<프로그래머스 문제풀이: 소수 만들기> Level 2 - 파이썬 (0) | 2020.12.17 |
---|---|
<프로그래머스 문제풀이: [연습문제] 최솟값 만들기> Level 2 - 파이썬 (0) | 2020.12.16 |
<프로그래머스 문제풀이: [해시] 전화번호 목록> Level 2 - 파이썬 (0) | 2020.12.13 |
<프로그래머스 문제풀이: [정렬] H-Index> Level 2 - 파이썬 (0) | 2020.12.12 |
<프로그래머스 문제풀이: [완전탐색] 소수 찾기> Level 2 - 파이썬 (0) | 2020.12.11 |