[프로그래머스 Python] Lv 2. 전화번호 목록
코딩테스트 고득점 Kit - 해시 문제
✔️ 문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
- 👉 문제 보러가기
✔️ 문제 풀이
(1) Pseudo-Code
- 전화번호부에 있는 요소들을 정렬하였을 때, 첫 번째 값만 접두사가 되는 것이 아니다.
1. 전화번호부에 있는 요소는 정렬되어있지 않기 때문에 sort로 순서를 정렬한다.
2. for문으로 i번째 값과 i+1번째 값의 길이가 다른 경우, i+1 값을 i 값의 길이로 슬라이싱하여 같은 지를 확인한다.
3. 같으면 False 를 변수에 할당하고, 반복문을 종료시킨다.
(2) 코드 작성
def solution(phone_book):
# 순서 정렬하여 접두사가 0번 위치에 있도록 설정
phone_book = sorted(phone_book)
# 접두사를 제외한 나머지 번호에서 접두사가 포함되었는지 확인
answer = True
for i in range(len(phone_book)-1):
if len(phone_book[i]) < len(phone_book[i+1]):
if phone_book[i+1][:len(phone_book[i])] == phone_book[i]:
answer = False
break
return answer
(3) 코드 결과
- 성능 요약 : 메모리 28.1 MB, 시간 89.30 ms
- 채점결과 : 정확성 83.3, 효율성 16.7, 합계 100.0/100.0
(4) 코드 리뷰
- for문과 sort, 슬라이싱으로 리스트 내에 있는 요소들의 값이 같은지 확인하였다.
- 위 문제에서 enumerate를 사용해볼까 했지만, 다음 요소의 값을 가져와야했기 때문에 적절하지 않다고 판단했다.
문제 회고
- 문제를 해석하는데 시간이 오래 걸렸다. (접두사가 한 개만 있을 것이라고 생각하였음)
- 코드 실행으로 3문제는 맞았지만, 제출 후 채점하기를 누르면 특정 테스트 번호에서 실패가 떴다.
- 문제를 열심히 읽어보니, 접두사가 하나만 있다고는 언급되지 않았다….! (문제를 자세히 보자! 입출력 예제만 믿지말자!)
- 여러 번의 실패 끝에, 코드를 완성하였다.
- 채점결과에서 효율성이 낮게 나와서 ‘효율성’은 어떤 것을 기준으로 채점되는지 확인해 보았다.
- 재귀함수 이용, 내장함수의 파라미터 개수 줄이기 등으로 효율성 점수를 높일 수 있다.
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기