코딩 테스트
[Python3] 프로그래머스 레벨 2 - 전화번호 목록
귀건
2021. 6. 6. 04:20
728x90
반응형
처음 작성한 코드
이중 for문을 사용해서 효율성에서 좋지 못한 모습을 보였다.(91점)
def solution(phone_book):
answer = True
phone_book.sort(key=len)
len_pb = len(phone_book)
for i in range(len_pb):
for j in range(i+1, len_pb):
if phone_book[j].startswith(phone_book[i]) == True:
return False
return True
궁금해서 해답을 보았는데 zip을 사용하여 반복문을 줄였다.
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
나는 모든 경우의 수(ex, 1,2,3 이라면 1-2 1-3 2-3 처럼 모두 확인)를 따져야 된다고 생각했는데 zip을 사용하면 그냥 바로 옆에 있는 경우만 확인하여 이게 모든 경우를 처리가능한가? 이런 의문점을 가졌다.
하지만 sort를 하게 되면 문자열의 앞자리부터 확인하며 정렬해주기 때문에 결국 비슷한 녀석끼리 붙어있게 된다는 것을 확인하였다.
phone_book = ["12","567","123","88","1235"]
이런 리스트는
['12', '123', '1235', '567', '88']
이렇게 정렬된다.
앞자리만 보면 1 - 1 - 1- 5 - 8
그 다음자리 수를 보면 2 - 2 - 2 - 6 - 8
처럼 각 자리수마다 정렬이 된다.
zip, startswith 함수를 다시 한번 정리할 수 있었다. bb
728x90
반응형