Algorithm/프로그래머스

프로그래머스) 전화번호 목록 - python 해시

제로__zero 2023. 9. 19. 20:25
 

프로그래머스

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

programmers.co.kr

💡 나의 접근 방법


1. "문자열" + x 를 이중 반복문을 통해서 확인한다? -> 최악의 경우 O(n^1) 시간발생

2. 해시로 모든 값을 저장하고 replace() 이용?

3. 정렬을해 길이가 짧은것부터 탐색한다? 

 

 

✨ 정답


정렬을 이용하는 방법

정렬 sort를 이용하지만, 나는 각 인덱스의 len() 순서대로 정렬을 생각했다. 문제에서는 숫자로 된 문자열이였고, 이는 정렬에 활용할 수 있다.

1️⃣ 접근 방법 1

문자열을 정렬시 오름차순으로 정렬하게 되어있다.

숫자 문자열의 경우 앞에서부터 차례대로 오름차순으로 정렬하기 때문에

[“10”, “1”, “5”] 의 경우 [’1’, ‘10’, ‘5’]로 출력되게 됨을 이용한다.

 

정렬을 하게 되면 리스트 내에서 1과 2,3,4.. 로 이중 비교할것을 앞에서 부터 1,2/ 2,3/ 3,4/.. 만 비교하여 접두사인지 확인할 수 있다.

 

2️⃣ 접근 방법 2

정렬된 리스트를 앞에서 부터 2개씩 비교하면 된다.

여기서 zip() 함수를 이용할 수 있다. list, list[1:]를 zip() 함수로 묶으면 1,2/ 2,3/ 3,4/… 로 묶을 수 있다.

 

3️⃣ 접근 방법 3

a.startswith(b) 는 a가 b로 시작되는지 확인하는 함수이다.

p2.startswith(p1) 뒤에 값을 앞의 값으로 시작하는 지 확인한다.

 

def solution(phone_book):
    answer = True
    phone_book = sorted(phone_book)

    for p1,p2 in zip(phone_book,phone_book[1:]):
        if p2.startswith(p1):
            answer = False
            return answer
    return answer

 

해시를 이용하는 방법

1번째 방법으로 문제를 풀 수 있다. 해시 딕셔너리에 모든 값을 넣는다. 

그리고 전화번호를 하나씩 저장해나가면서 딕셔너리에 값을 값이 있는지 확인한다.

def solution(phone_book):
    hash_map = {}
    for phone_number in phone_book:
        hash_map[phone_number] = 1

    for phone_number in phone_book:
        jubdoo = ""
        for number in phone_number:
            jubdoo += number  
            if jubdoo in hash_map and jubdoo != phone_number:
                return False
    return True

 

이 문제에서는 정렬을 이용해 문제 푸는데 시간적으로 더 효율적인것 같다.