CodeKata Week2- Day3

신지원·2021년 4월 7일
0

문제

s는 여러 괄호들로 이루어진 String 인자입니다.
s가 유효한 표현인지 아닌지 true/false로 반환해주세요.

종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다.

한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다.
괄호 순서가 맞아야 한다.

예를 들어 아래와 같습니다.

s = "()"
return true

s = "()[]{}"
return true

s = "(]"
return false

s = "([)]"
return false

s = "{[]}"
return true
  1. 먼저 무조건 답이 될 수 없는 경우들을 생각한다.
  2. 닫힌 괄호로 시작하는 요소를 새로운 리스트에 넣고, 닫힌 괄호가 나올때 새로운 리스트의 맨 마지막 요소와 같은지 비교를 한다.
  3. 새로운 리스트의 마지막 요소랑 같으면 그거 삭제
  4. 리스트에 아무것도 남지 않을 경우 return True

닫힌 괄호랑 열린 괄호 리스트를 따로 만들어 놓고 비교

내가 푼 답

def is_valid(string):
    arr1 = [']', ')', '}']  # 닫힌 괄호
    arr2 = ['[', '(', '{']  #열린 괄호
    li = []

    # 처음부터 틀린경우
    if string[0] in arr1 or len(string) % 2 == 1 or string[-1] in arr2:
        return False
        
    # string요소 하나하나를 돌면서 확인 할 거임
    for i in range(len(string)): # 스트링 길이만큼 돔
        if string[i] in arr2: # i번째 인덱스의 요소기 열린 괄호면
            li.append(string[i])  # 리스트에 추가해
        else: # i번째 인덱스의 요소가 닫힌 괄호면
            if arr2.index(li[-1]) == arr1.index(string[i]):  # 열려있는거 추가된 리스트에 있던 괄호를 arr2에서 찾아서 닫혀있는 괄호 즉,새로 들어온 애랑 비교해
                li.pop()   # 같으면 리스트에서 삭제
            else:
                return False
    return True

.index('찾고 싶은 string')
원하는 요소의 인덱스 구할 수 있음.

  • Return 값 어디에 넣을지 잘 생각.
    return을 만나면 조건문이든 반복문이든 그 문장은 끝나게 된다.

0개의 댓글