- 코드카타 26번 문제 풀이 이해
def solution(s): answer = True num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] if len(s) == 4 or len(s) == 6: for x in s: if x in str(num): pass else: answer = False else: answer = False return answer
우선 내가 푼 풀이방식은 이렇다. for문을 if문으로 감싸고 그 안에 if문이 있어서 개인적으로 만족스럽지 않은 코드이다. 시간복잡도 빅오 방식으로 계산했을 때 안 좋은 방식일 거라 생각했는데, 우선 if문 자체는 O(1)형태로 시간복잡도 자체엔 그렇게 큰 영향을 안 준다고 한다. 물론 if문을 남발했을때 클라이언트의 성능 자체에 영향을 미치는 것은 자명할 것이다. 그리고 숫자 형태를 리스트로 미리 규정해 놓는 것이 문제에서 원래 요구하는 해답 방식인지도 잘 모르겠다.
def alpha_string46(s): print(len(s) in [4, 6]) try: int(s) except: return False return len(s)
이후 해답코드 하나를 보면서 이해하기 위해 약간 조작한 것이 위의 코드이다. 우선 원래 형태는 except문 이후의 return값에 <return len(s)==4 or len(s)==6> 형태로 되어있어서 내가 return 함수에 대해 잘못 알고 있나 했다. 우선 나는 if문으로 len(s)가 4나 6인지를 규정해줬기 때문에 return 내에서 if문이 작동하는 것인가 했다. 그래서 return의 사용법에 대해 다시 검색해봤고, return은 함수의 결과값을 반환해주는 기능을 하는 녀석(메서드?)이고 결과값을 반환받아 함수를 빠져나오게 해준다. 그래서 return은 단지 len(s)==4의 값을 반환해주는 것 뿐인데, 이것의 return값이 True/False로 나오는 까닭은 파이썬 자체가 어떠한 식에 대답하는 방식에 해답이 있었다. 그냥 아무런 조건 없이 print(1+1==2)를 한다면 print값은 True로 나오는 것이고, 1+1==2 라는 조건일때 어떠한 값을 반환해줘야지 한다는 개념이 아니라 그냥 True/False인지만 바로 판단해준다는 것을 깨달았다. 그래서 위의 코드로 연습해 본 내용을 정리하면,
print(alpha_string46("a234")) print(alpha_string46("1234")) print(alpha_string46("1234215325"))
예제가 이렇게 있을때 첫번째 a234의 문자열이 4의 길이기 때문에 print값으로 True가 나오고 try함수에서 int에 실패했기 때문에 except로 넘어가 False를 반환해준 뒤 함수에서 빠져나온다. 그럼 이제 두번째 예제로 넘어갈 것이고, 1234의 문자열의 길이를 반환해주고 int에도 성공한 이후, except함수를 넘어간 다음 가장 밑의 return 값의 len(1234)를 반환해준다고 생각하면 된다.