ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 해쉬_전화번호 목록
    Algorithm/programers 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 조합을 사용하는 것도 나쁘지 않은 선택인 것 같다.

    'Algorithm > programers' 카테고리의 다른 글

    안전지대  (0) 2024.08.18
    완전탐색_모음사전  (0) 2022.10.27
    해쉬_완주하지 못한 선수  (0) 2022.10.26
    [Lv.1] 성격 유형 검사하기  (1) 2022.09.24
    [Lv.1] 나머지가 1이 되는 수 찾기  (0) 2022.09.22
Designed by Tistory.