Algorithm/programers

해쉬_전화번호 목록

casylm 2022. 10. 26. 23:16

접근 방식

1. 완전 탐색

문제를 읽고 가장 먼저 생각나는 것은 완전 탐색일 것이다.

리스트의 원소 1개를 기준으로 전체를 탐색하며 접두어가 되는지 확인하는 것이다.

이 방식을 사용한다면 1) 리스트 원소 마다 2) 전체를 탐색하며 접두어가 되는지 확인 하는 과정이 필요하고

2중 Loop 으로 구현이 가능하다.

하지만, 문제의 제약조건 [phone_book의 길이는 1 이상 1,000,000 이하입니다.] 을 확인하면 이 방식은 1,000,000 x 1,000,000 의 시간이 걸리는... 관계로 제외하였다.

 

2. sort/Loop

2중 Loop를 1중 Loop으로 변환 할 방법을 고안하다 생각해낸 것이 정렬이다.

문제를 잘 살펴보면 결국 접두어가 된 다는 것은 앞 숫자가 뒷 숫자의 가장 큰 자리 부터 일부분이 같다는 것으로 해석 가능하고 이를 적용하여 사전에 배열을 오름차순 정렬하였다.

 

시도1

def solution(phone_book):
    answer = True
    
    d = {}
    
    phone_book.sort()
    
    for idx in range(len(phone_book)-1):
        if phone_book[idx] in phone_book[idx+1]:
            answer = False
            break
            
    return answer

 

오류

13번만 오류나서 원인을 찾아보니

- 이전 인덱스의 전화번호가 이후 인덱스의 전화번호 안에 있는지 확인하면 오류
- 접두사인지 확인해야 하기 때문에, 이전 인덱스의 전화번호 길이만큼의 이후 인덱스 문자열과 이전 인덱스 문자열이 같은지 확인하는거로 수정

을 알 수 있었다.

 

접두어를 확인해야 하는 코드를 작성하며 막상 비교 할 때 in으로 비교하여 접두어가 아닌 포함여부를 따진 것..!

 

시도2

def solution(phone_book):
    answer = True
    
    d = {}
    phone_book.sort()
    
    for idx in range(len(phone_book)-1):
        # 수정 부분 : 이전 값이 다음 값의 앞부분-이전값 길이 만큼 같은지 확인
        if phone_book[idx] == phone_book[idx+1][:len(phone_book[idx])]:
            answer = False
            break
            
    return answer

수정 후 잘 작동하였다.

 

결과

사실 한 번호가 다른 번호의 접두어인 경우와 같이 문제에서 해쉬를 암시하는 듯한 뉘앙스가 나와서 해쉬로 접근했는데,

마땅한 풀이 방식이 떠오르지 않았다.

sort 정렬을 하는 것에 효율성 실패가 되지 않을까 싶었는데, 잘 통과되는 걸 보니

이런 문제에서는 sort/loop 조합을 사용하는 것도 나쁘지 않은 선택인 것 같다.