Programmers, 전화번호 목록
TL;DR
- 해시(Hash)
문제 요약
1. 전화번호부에 여러 사람의 번호가 리스트 형태로 주어진다.
2. 주어진 전화번호 중 하나의 번호가 다른 번호의 접두어인지 확인한다.
3. 만약 접두어인 경우가 있으면 False, 없다면 True를 반환한다.
- 접두어는 가장 앞에 오는 형태를 말한다. 입출력 형태를 통해 이를 확인할 수 있다.
입출력 형태
예시 1 :: '119'가 '1195524421'의 접두어가 되기 때문에 False를 반환한다.
- 한 번호가 다른 번호의 접두어인 경우는 접두어가 되는 번호가 다른 번호에 포함되어 있으면서, 접두어가 되는 번호로 시작해야 한다.
예시 2 :: 그 어떤 번호도 다른 번호의 접두어인 경우가 없다.
예시 3 :: '12'가 '123', '1235'의 접두어이기 때문에 False를 반환한다.
풀이
def solution(phone_book):
phone_book.sort()
for prefix, target in zip(phone_book, phone_book[1:]):
if target.startswith(prefix):
retrun False
return True
접두어인 번호는 다른 번호에 비해 길이가 짧을 것이다. 따라서 전화번호부를 문자열의 길이 순으로 정렬한다.
길이가 가장 짧은 번호부터 다른 번호의 접두어인지 확인한다. 만약 다른 번호의 접두어라면 False를 반환하며 종료한다.
- `zip()`으로 접두어를 제외한 배열과 하나의 배열로 묶어서 확인을 진행한다. 중복 조회를 하지 않게 된다.
- 번호가 접두어 후보 문자로 시작(`startswith`)한다면 접두어인 경우이므로 False를 반환한다.
- `in`을 사용하면 안되는 이유는 번호 내에 접두어로 의심되는 번호가 있으나 접두어가 아닌 경우가 존재하기 때문이다.
- '12', '3412'와 같은 경우에 `in`으로 작성한 코드에서는 False를 반환하지만, '12'는 '3412'가 아니므로 True를 반환해야 한다.
- `startswith`를 사용하면 이런 테스트 케이스들을 통과할 수 있다.
조회 결과 접두어가 없다면 True를 반환한다.
'개발 > Algorithm' 카테고리의 다른 글
[프로그래머스] 이진 변환 반복하기(python) (0) | 2021.09.29 |
---|---|
[프로그래머스] 파일명 정렬(python) (0) | 2021.09.29 |
[프로그래머스] 가장 큰 수(python) (0) | 2021.09.27 |
[프로그래머스] 소수 찾기(python) (0) | 2021.09.23 |
[프로그래머스] 더 맵게(python) (0) | 2021.09.23 |