엘리스 AI 트랙🐇/[AI 5기] 연습 문제집_파이썬 실습

[파이썬 실습] 심화 문제_괄호의 짝

개발조각 2022. 6. 7. 13:53
728x90
반응형

괄호의 짝

파이썬에서 사용하는 괄호는 다양한 종류가 있습니다.

그 중 [ ], ( ), { }는 다들 여러번 사용해보셨을 겁니다.

괄호를 사용할때는 항상 짝이 맞는 것을 확인해야 합니다. 예를 들어 { ( ) [ ] }는 짝이 맞지만 { [ } ] ( ) 는 짝이 맞지 않습니다.

이것을 확인하는 파이썬 프로그램을 리스트를 활용해서 만들어보려고 합니다.

힌트로 제공하는 내용과 지시사항을 읽고 프로그램을 완성하세요

 

지시사항

  1. 사용자로부터 영어, 숫자, 사칙연산 기호 +*-/ 그리고 괄호들로 구성된 문장을 입력받습니다.
(a+b[a])+[{(b*e)/(a+q)}]
Copy
  1. 문자열에서 괄호가 아닌 문자는 제거합니다.
([])[{()()}]
Copy
  1. 리스트의 pop()과 push()를 이용해서 괄호의 짝이 맞는지 맞지 않는지를 테스트합니다.
  2. 짝이 맞다면 정상, 짝이 맞지 않는 부분이 하나라도 있다면 비정상이라고 출력합니다. 위 문장은 짝이 맞으므로 정상을 출력합니다.
정상
Copy

힌트

리스트의 push 메서드는 리스트의 마지막에 요소를 추가합니다.

my_list.push("a")   #my_list의 마지막에 "a"를 추가합니다
Copy

리스트의 pop 메서드에 매개변수를 주지 않으면 리스트의 마지막 요소를 리스트에서 제거하고 그 요소를 리턴합니다.

my_list.pop()   # my_list의 마지막 요소를 제거하고 그 값을 리턴합니다.

주의할 점은 빈 리스트에서 pop( ) 를 호출하면 애러가 발생하니 예외처리 혹은 호출전에 리스트가 비었는지 체크가 필요합니다.

주의사항

출력형식이 다르면 오답처리될 수 있습니다.


정답

def CheckBracket(string): # string의 괄호의 짝을 체크하는 함수
    bracket_list = [ ] # 괄호 체크에 사용할 리스트   
    
    dic_brackets = { '{':'}','[' : ']','(' : ')'}  
    # dic_brackets: 열린 괄호의 짝을 저장한 딕셔너리 
    # dic_brackets.values() : 닫힌 괄호들
    
    # 문자열에서 괄호가 아닌 문자 제거
    str1 = ''
    for char in string:
        if char in dic_brackets or char in dic_brackets.values() : str1 += char
        
    # 괄호의 짝이 맞는지 맞지 않는지 테스트
    count = 0
    for char in str1:
        if char in dic_brackets : 
            bracket_list.append(dic_brackets[char])
        else :
            if len(bracket_list) == 0 :
                count = -1
                break
            if char == bracket_list[len(bracket_list)-1] : bracket_list.pop()
                
    return False if len(bracket_list) != 0 or count == -1 else True

string = input()
print("정상" if CheckBracket(string) else "비정상")

 

문자열에서 괄호가 아닌 문자 제거

# 문자열에서 괄호가 아닌 문자 제거
str1 = ''
for char in string:
    if char in dic_brackets or char in dic_brackets.values() : str1 += char

저는 여기서 in을 활용해서 char이 괄호인지 아닌지 판단했습니다.

  • char in dic_brackets : dic_brackets의 key 중에서 char이 있는지
  • char in dic_brackets.values() : dic_brackets의 value 중에서 char이 있는지
  • 딕셔너리.values() : Dictionary형 dict의 모든 Value를 반환

제대로 실행이 되었는지 확인하기 위해 아래 문자열을 입력해보시면 됩니다.

  • aa))][]qq

 

괄호의 짝이 맞는지 맞지 않는지 테스트

# 괄호의 짝이 맞는지 맞지 않는지 테스트
bracket_list = [ ] # 괄호 체크에 사용할 리스트
count = 0
for char in str1:
    if char in dic_brackets : 
        bracket_list.append(dic_brackets[char])
    else :
        if len(bracket_list) == 0 :
            count = -1
            break
        if char == bracket_list[len(bracket_list)-1] : bracket_list.pop()

return False if len(bracket_list) != 0 or count == -1 else True

 

 

str1 = '([])[{()()}]'

  1. char = '(' → bracket_list = [')']
  2. char = '[' → bracket_list = [')', ']']
  3. char = ']' → bracket_list = [')']
  4. char = ')' → bracket_list = []
  5. char = '[' → bracket_list = [']']
  6. char = '{' → bracket_list = [']', '}']
  7. char = '(' → bracket_list = [']', '}', ')']
  8. char = ')' → bracket_list = [']', '}']
  9. char = '(' → bracket_list = [']', '}', ')']
  10. char = ')' → bracket_list = [']', '}']
  11. char = '}' → bracket_list = [']']
  12. char = ']' → bracket_list = []

노랑 밑줄은 pop()을 했을 때 입니다.

 

이런 경우만 있으면 좋겠지만 bracket_list가 빈 리스트인 경우가 있습니다.

str = '(()))('

  1. char = '(' → bracket_list = [')']
  2. char = '(' → bracket_list = [')', ')']
  3. char = ')' → bracket_list = [')']
  4. char = ')' → bracket_list = []
  5. char = ')' → bracket_list = [] => 빈 리스트인데 pop()할 수가 없는데???

5번 같은 경우가 발생을 해서 이럴 때를 위해 count = -1로 변경해주고 break를 했습니다.

 

그래서 True와 False를 비교를 할 때 조건을 len(bracket_list) != 0 or count == -1로 넣어 주었습니다.

 

return False if len(bracket_list) != 0 or count == -1 else True

이 코드는 자바스크립트에서 삼항 연산자 같은 조건문입니다.

  • 자바스크립트 : 조건 ? 참 : 거짓
  • 파이썬 : 참 if 조건 else 거짓

이렇게 써주면 됩니다.


이문제를 풀려고 돌고 돌아 드디어 풀었습니다.😭

지금 생각하면 어려운 문제는 아닌데 왜 이렇게 어렵게 갔는지 제가 실력이 부족해서겠죠

 

파이썬 문제를 풀 때 가장 주의해야 되는 점

쓸데없는 print()는 주석처리를 하던가 없애야 됩니다.

안 그럴 경우 맞는 답도 오류라고 표시되고 작동도 안 하더라고요.

 

엘리스 연습 문제를 풀면서 느낀 점

엘리스 연습 문제를 풀면서 느낀 점은 제발 꼭 제발 지시사항 꼼꼼히 읽자입니다.

지금 다시 생각해 보니까 제가 제대로 안 읽어서 이렇게 돌고 돌아 푼 것 같습니다.

막상 제가 푼 답이랑 지시사항과 코드에 주석을 비교해보니 답이 거의 그대로 써져 있더라고요

  • 리스트의 push 메서드는 리스트의 마지막에 요소를 추가합니다.
  • 리스트의 pop 메서드에 매개변수를 주지 않으면 리스트의 마지막 요소를 리스트에서 제거하고 그 요소를 리턴합니다.
  • 주의할 점은 빈 리스트에서 pop( )를 호출하면 애러가 발생하니 예외처리 혹은 호출 전에 리스트가 비었는지 체크가 필요합니다.
  • # dic_brackets: 열린 괄호의 짝을 저장한 딕셔너리 
  • # dic_brackets.values() : 닫힌 괄호들

이 설명과 같이 제가 푼 코드에 append, pop, dic_brackets, dic_brackets.values()를 다 썼습니다.

다들 문제 풀 때 문제 꼼꼼히 읽으세요. 

 

 

728x90
반응형