[CodeKata] 8. is_valid

그냥·2022년 6월 16일
0

CodeKata

목록 보기
7/18

문제

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

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

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


s = "()"
return true

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

s = "(]"
return false

s = "([)]"
return false

s = "{[]}"
return true


풀이

  1. 문제의 조건 정리
1) 인자로 '(', ')', '[', ']', '{', '}' 를 받는다.
2) True, False를 반환한다.
3) 괄호 시작과 끝의 순서가 맞아야 한다.

  1. 조건에 대한 코드 구현 방법 생각
1) string이 True가 나오기 위해서는 짝이 맞아야 하므로 len(string)이 짝수이어야 한다.
2) replace 메소드를 사용해서 (), [], {}로 되어 있는 것들을 ""으로 바꾸자.

  1. 구현 코드
  if len(string) % 2 == 0:
    for i in range(len(string)):
      string = string.replace("()", '')
      string = string.replace("[]", '') 
      string = string.replace("{}", '')
      if len(string) == 0:
        return True
  else:
    return False
    
  if len(string) > 0:
    return False

  1. 코드 리뷰
1) len(string)이 짝수 일떄 아닐 때로 구분한 것은 좋은 방법이었다.
2) replace를 일일이 주는 방법 말고 좋은 방법이 있을 것 같다.
3) 마지막 if문은 예외 처리 용도라 if문 말고 다른 좋은 방법이 있을 것 같다.

  1. 최고의 코드
def is_valid(string):
  while '()'in string or '[]' in string or '{}' in string:
    for i in ['()','[]','{}']:
      string = string.replace(i,'')
      
  return string == ''

1) for문을 쓰지 않고 while문을 사용한 케이스이다. while문 조건으로 string 내에 '()', '[]', '{}'가 없으면 반복이 끝나게 되어 있다.
2) replace를 통해서 바로바로 괄호를 없앤다.
3) 마지막에 string내 값이 비어있으면 True, 비어 있지 않으면 False

0개의 댓글