반응형
1차시도! 성공인데 사실은 틀린 코드
def solution(phone_book):
answer = True
phone_book.sort()
phone_book_dict=dict(zip(phone_book,range(len(phone_book))))
for i in phone_book:
phone_book_dict.pop(i)
for j in phone_book_dict:
if i in j:
return False
return answer
아이디어
- 비교 횟수를 줄이기 위해 phone_book을 정렬합니다.
- phone_book 리스트의 값을 key로 갖는 딕셔너리를 만듭니다.
- phone_book 리스트의 각 요소가 (for i in phone_book) 다른 요소값(phone_book_dict.pop(i), for j in phone_book_dict)에 포함됐는지 확인합니다.
틀린 이유
- 접두사인지 아닌지는 판단 못하고 포함됐는지만 확인됩니다. 예를 들어, ["12","312","111"] 인 경우는 True인데 위 코드에서는 False가 됩니다. 접두어가 아니지만 "12"가 "312"에 포함되긴 하니깐요.
근데 프로그래머스에서는 정답으로 처리되네요.
다른 분들의 코드
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
- 신기하리만큼 많은 분들이 똑같은 코드를 짜셨더라구요!
- zip(phoneBook, phoneBook[1:])로 요소 2개씩 비교합니다.
- startswith() 함수로 접두어인지 확인합니다.
파이썬개념
1) 해당 값이 딕셔너리 key에 포함됐는지 확인
i in phone_book_dict
i in phone_book_dict.keys()
i in list(phone_book_dict.keys())
포함됐으면 True, 포함되지 않았으면 False를 반환합니다.
2) 딕셔너리도 pop을 할 수 있습니다. key를 기준으로 수행됩니다.
sunny_dict={"hi":22, "sunny":33}
print(sunny_dict)
# {"hi":22, "sunny":33}
sunny_dict.pop("hi")
print(sunny_dict)
# {"sunny":33}
3) 리스트 인덱스 슬라이싱
a=[1,3,2,5,4]
for p1, p2 in zip(a,a[1:]):
print(p1, p2)
# 1 3
# 3 2
# 2 5
# 5 4
원소 2개씩 비교하고 싶을 때 사용하면 유용하겠네요.
4) startswith() 함수
p1="hi"
p2="hisunny"
if p2.startswith(p1):
print("bye")
# bye
p2가 p1으로 시작되는지 확인합니다. True 혹은 False를 반환합니다.
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스] kakao 2018 코딩테스트 - 오픈채팅방 (python) (4) | 2019.09.03 |
---|---|
[프로그래머스] KAKAO 2018 코딩테스트 - 실패율 (python) (2) | 2019.09.02 |
[프로그래머스] 해시 - 완주하지 못한 선수 (python) (2) | 2019.08.27 |
[프로그래머스] 스택/큐 주식가격 (python) (4) | 2019.08.26 |
[프로그래머스] 스택/큐 기능개발 (python) (4) | 2019.08.25 |
댓글