View
문제
s는 여러 괄호들로 이루어진 String 인자입니다. s가 유효한 표현인지 아닌지 true/false로 반환해주세요.
종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다.
한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다. 괄호 순서가 맞아야 한다.
예를 들어 아래와 같습니다.
나의 풀이
Replit 예시로 테스트시에는 pass 가 나와서 안심하고있었으나....
나의 코드에 오류가 있음을 발견하였다!!!! ㅠㅠ
string = ['(', '(', ')', ')', '{', '}']
Replit 예시는 중복된 여는 괄호가 2개까지만 있었다.
def is_valid(string):
templete = {'(':0, ')':1, '[':2, ']':3, '{':4, '}':5}
# 닫는 기호로때 시작하면 무조건 Flase
k = string[0]
if templete[k] % 2 == 1 or len(string) == 1:
return False
# 여는 기호로 시작하는 경우
for i in range(0,len(string)-1):
if templete[string[i]] % 2 == 0:
# 여는 기호가 중복으로 나올 때
if templete[string[i]] == templete[string[i+1]]:
if templete[string[i+3]] == templete[string[i]] + 1:
if templete[string[i]] + 1 != templete[string[i+1]]:
return False
else:
return False
내 코드의 한계는
모양이 서로 다른 여는 괄호가중복이 3개 이상이라면 검증이 불가능하다^^.........
print(is_valid(['[', '(', '(','[',']', ')', ')', ']']))
>> False
짝의 풀이
def is_valid(string):
first = [‘(’, ‘{’, ‘[’]
second = [‘)’, ‘}’, ‘]’]
empty = []
if len(string) % 2 == 1:
return False
for s in string:
if s in first:
empty.append(s)
elif s in second:
if len(empty) == 0:
return False
elif second.index(s) != first.index(empty.pop()):
return False
return True
1. 괄호 각각을 짝을 지어주기 위해 리스트를 각각 생성하여, 인덱스를 매칭 해주는 원리.
2. 한번 검증된 아이는 검증이 반복 되는 것을 막기 위해 바구니 empty를 만들어주어, 검증할 아이들을 담아주고 아이들이 검증되면,
empty바구니에서 제거해준다.
3. 해당 값이 리스트에서 몇번째 인덱스에 위치하고 있는지를 알고싶으면 index함수를 사용하여 "list이름.index(값)"로 찾아준다.
4. pop()함수는 리스트에서 특정 값을 꺼내는 동시에 리스트에서 제거하고 싶을 때 사용하며,
pop()에서 ()안에는 꺼내면서 리스트에서 제거하고싶은 값의 인덱스를 적는다.
>>> string = ['a','b','c','e']
>>> string.pop(1)
'b'
>>> print(string)
['a', 'c', 'e']
그렇다면, pop()의 괄호안에 아무것도 넣지 않는다면!!???
string = ['a', 'c', 'e']
>>> string.pop()
'e'
>>> print(string)
['a', 'c']
리스트이 마지막 값이 나오면서 기존 리스트에서 삭제되는 것을 볼 수 있다~!!
짝의 풀이를 참고하여 내가 다시 작성해본 코드
def is_valid(string):
first = ['(', '[', '{']
second = [')', ']', '}']
empty= []
if len(string) % 2 == 1 or (string[0] in second):
return False
for i in string:
if i in first:
empty.append(i)
elif i in second:
if len(empty) == 0:
return False
elif second.index(i) != first.index(empty.pop()):
return False
return True
소감
매번 코드카타때마다 짝분들 덕분에 많이 배워간다.
매일 푸는 문제들을 그냥 지나치지 말고 그때 그때 잘 정리하여 내 것으로 만들어가야겠다 ~~!!😀
'Wecode 부트캠프' 카테고리의 다른 글
TIL | Session_Git Workflow & Rebase (0) | 2021.09.14 |
---|---|
TIL 28 | Session_Linux & Terminal (0) | 2021.08.10 |