본문 바로가기
연습하기/Python 문제풀이

[Python] 99클럽 코테 스터디 7일차 TIL : Break

by 니나노래방 2024. 7. 29.

 

- 오늘의 학습 키워드
- 공부한 내용 본인의 언어로 정리하기
- 오늘의 회고 :  

  - 문제 링크 :  https://school.programmers.co.kr/learn/courses/30/lessons/12909#
  - 어떤 문제가 있었고, 나는 어떤 시도를 했는지

 

첫 코드 

- 생각 : '('와 ')' 갯수를 세줘서 둘이 같으면 되는 것 아닐까? 

- 함정 : ")()("와 같은 케이스를 걸러내지 못합니다. 

def solution(s):
    cnt_start = 0
    cnt_end = 0
    
    for i in range(len(s)):
        if cnt_start == 0 and s[i] == ")":
            answer = False
            break
            
        elif s[i] == "(":
            cnt_start += 1
        else:
            cnt_end += 1
    
    if cnt_start == cnt_end and cnt_start != 0:
        answer = True
    
    else:
        answer = False
    
    # [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    print('Hello Python')

    return answer

 

 

두 번째 코드:

- 생각 : 그럼 예외 케이스를 미리 걸러버리면 되겠다. 처음부터 ')'이 나오면 False를 리턴해버리고, 마지막에 '('이 나와도 문제가 있는 것이므로 False를 리턴하자. 

- 함정 : 위의 예외 케이스는 걸러냈지만 '())((()'와 같은 케이스는 걸러내지 못합니다. '('은 늘 ')'의 갯수와 동일하거나 더 많아야 하는데, 세 번째 예외 케이스를 보면 3번째 원소에서 괄호가 열리지도 않은 채 두 번 닫혔습니다. 

def solution(s):
    cnt_start = 0
    cnt_end = 0
    
    for i in range(len(s)):
        if i == 0 and s[i] == ")":
            answer = False
            return answer
            break
        
        if i == len(s) - 1 and s[i] == "(":
            answer = False
            return answer
            break
        
        if s[i] == "(":
            cnt_start += 1
        
        else:
            cnt_end += 1
        
    if cnt_start != cnt_end:
        answer = False
    
    else:
        answer = True
    
    return answer

 

 

뭐가 문제일까.. 

 

놓친점 :

반복문을 돌 때에도 '(' 숫자보다 ')'의 숫자가 많다면 일단 걸러줘야 합니다. 

 

해결 :

반복문을 돌 때마다 '('와 ')'의 숫자를 카운트해줬습니다. 반복문마다 예외 케이스를 찾아 False 리턴을 해줬더니 해결되었습니다. 

def solution(s):
    cnt_start = 0
    cnt_end = 0
    answer = True
    
    for item in s:
        if item == "(":
            cnt_start += 1
        else:
            cnt_end += 1
        
        # 갯수를 센 시점에서 ')'의 갯수가 더 많다면 False입니다.
        if cnt_start < cnt_end:
            answer = False
            return answer
            break
            
    # for문에서는 살아돌아왔지만, '('와 ')' 갯수 불일치일 경우 False입니다.
    if cnt_start != cnt_end:
        return False
    
    else:
        return True

 

댓글