[파이썬 실습] 심화 문제_괄호의 짝
괄호의 짝
파이썬에서 사용하는 괄호는 다양한 종류가 있습니다.
그 중 [ ], ( ), { }는 다들 여러번 사용해보셨을 겁니다.
괄호를 사용할때는 항상 짝이 맞는 것을 확인해야 합니다. 예를 들어 { ( ) [ ] }는 짝이 맞지만 { [ } ] ( ) 는 짝이 맞지 않습니다.
이것을 확인하는 파이썬 프로그램을 리스트를 활용해서 만들어보려고 합니다.
힌트로 제공하는 내용과 지시사항을 읽고 프로그램을 완성하세요
지시사항
- 사용자로부터 영어, 숫자, 사칙연산 기호 +*-/ 그리고 괄호들로 구성된 문장을 입력받습니다.
(a+b[a])+[{(b*e)/(a+q)}]
Copy
- 문자열에서 괄호가 아닌 문자는 제거합니다.
([])[{()()}]
Copy
- 리스트의 pop()과 push()를 이용해서 괄호의 짝이 맞는지 맞지 않는지를 테스트합니다.
- 짝이 맞다면 정상, 짝이 맞지 않는 부분이 하나라도 있다면 비정상이라고 출력합니다. 위 문장은 짝이 맞으므로 정상을 출력합니다.
정상
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 = '([])[{()()}]'
- char = '(' → bracket_list = [')']
- char = '[' → bracket_list = [')', ']']
- char = ']' → bracket_list = [')']
- char = ')' → bracket_list = []
- char = '[' → bracket_list = [']']
- char = '{' → bracket_list = [']', '}']
- char = '(' → bracket_list = [']', '}', ')']
- char = ')' → bracket_list = [']', '}']
- char = '(' → bracket_list = [']', '}', ')']
- char = ')' → bracket_list = [']', '}']
- char = '}' → bracket_list = [']']
- char = ']' → bracket_list = []
노랑 밑줄은 pop()을 했을 때 입니다.
이런 경우만 있으면 좋겠지만 bracket_list가 빈 리스트인 경우가 있습니다.
str = '(()))('
- char = '(' → bracket_list = [')']
- char = '(' → bracket_list = [')', ')']
- char = ')' → bracket_list = [')']
- char = ')' → bracket_list = []
- 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()를 다 썼습니다.
다들 문제 풀 때 문제 꼼꼼히 읽으세요.