우당탕탕 개발일지

[해시] 프로그래머스 level 2 전화번호 목록 (Python 파이썬) 본문

알고리즘

[해시] 프로그래머스 level 2 전화번호 목록 (Python 파이썬)

민아당긴아 2024. 2. 8. 18:11

💡문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡문제 분석 요약

  1. 전화번호부에 적힌 전화번호를 담은 리스트 phone_book(길이는 100만 이하, 메모리 4MB 이하)
  2. 모든 전화번호에 대해서 접두어 관계가 하나라도 형성되면 false 리턴

 

💡알고리즘 설계

1. phone_book 리스트 정렬

2. 앞에서부터 완전 탐색 진행

3. i번째 원소가 i+1번째 원소의 앞부분과 일치하면 answer를 False로 바꾸기

4. answer 리턴

💡코드

def solution(phone_book):
    answer = True
    phone_book.sort() 
    for i in range(len(phone_book)-1): 
        l = len(phone_book[i])
        if phone_book[i+1][:l] == phone_book[i]:
            answer = False
    return answer

 

💡 오답 풀이

def solution(phone_book):
    answer = True
    phone_book.sort(key = len) 
    for i, p1 in enumerate(phone_book): 
        for p2 in phone_book[i + 1: len(phone_book)]: 
            if p1 == p2[:len(p1)]:
                answer = False
                break
    return answer

처음에 이 코드를 작성했을 때, 정확성 테스트는 다 통과했는데 효율성 테스트에서 다 시간 초과가 떴다..

아무래도 이중 반복문을 써서 그런 것 같다.

아니 그러면 이중 반복문 안 쓰고 어떻게 하는거지..?

**초기 알고리즘 설계**

1. 전화번호 길이를 기준으로 phone_book 정렬(접두어가 될 가능성이 높은 전화번호를 맨 앞으로)

2. 앞에서부터 전화번호 탐색

3. i번째 전화번호를 골랐을 때, i+1번째 전화번호부터 끝까지 탐색

4. i번째 전화번호가 i+1번째 전화번호의 접두어일 경우 answer를 false로 바꾸고 break로 끝내버리기

5. answer값 리턴

접두어가 있으면 false, 없으면 true

 

💡 다른 풀이

...

 

💡 느낀점 or 기억할정보

3. i번째 원소가 i+1번째 원소의 앞부분과 일치하면 answer를 False로 바꾸기

이걸 생각해내야하는 문제

왜 초반에는 굳이굳이 sort(key = len)을 써서 문자열 길이순으로 정렬하려 했는지 참..