티스토리 뷰

728x90
반응형

이번 문제는, 해시를 이용한 문제입니다.

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

 

문제를 살펴보면

1. 사람들 끼리 전화번호가 중복되지 않고

2. A의 전화번호가 B의 전화번호 앞자리와 같은가?

를 보는 문제입니다.

이때, 119와 117465라는 번호가 있으면, 11까지는 같지만 119와 117이 다르기 때문에

 

이러한 경우는 119가 117465의 접두가사 아닙니다.

 

그렇다면, 가장 작은 크기의 전화번호 크기만큼을 번호 앞글자를 Hash Key로 사용하는 Hash Table을 구성하면

 

Hash Table내에는

1. Table Key 와 동일한 값을 갖는 Element가 존재안함

--> 탐색 실패(119와 117465의 앞자리 길이가 2인 Case)

2. Table Key 와 동일한 값을 갖는 Element가 존재하면서 Table의 길이가 1이다

--> 탐색 실패(앞자리가 중복되는 경우가 없는 Case)

3. Table Key 와 동일한 값을 갖는 Element가 존재하면서 Table의 길이가 2 이상이다

--> 탐색 성공

 

이때, 모든 Hash Key에 대해서 탐색이 실패하면, 앞글자를 탐색할 수를 1씩 증가시키며 알고리즘을 반복합니다.

 

아래는 정답 코드입니다 :)

def solution(phone_book):
    answer = True
    #전화번호의 최소길이와 최대길이를 확인합니다.
    test = 22
    maximum = 0
    for i in phone_book:
        if len(i)<test:
            test = len(i)
        if len(i)>maximum:
            maximum = len(i)            
    end = False
    #전화번호의 가장 짧은 길이만큼을 Hash key로 하는 Hash Table을 생성    
    #이때, 가장 짧은 길이에서 탐색이 안되면, 길이를 늘려서
    #최대길이가 될 때 까지 반복을 진행
    while True:        
        temp_result = {}        
        #Hash Key를 기준으로 Hash Table을 Update시켜줍니다
        for i in phone_book:                
            try:
                temp_result[i[:test]].append(i)
            except:
                temp_result[i[:test]] = [i]
        #완성된 Hash Table에서 Hash Key가 Hash key에 해당하는 Table에 있고
        #Table의 길이가 2 이상(Hash Key 말고 추가적인 Element가 있는지 여부)
        #일 경우 전화번호의 선두가 겹치므로, 알고리즘을 종료합니다.
        for i in temp_result:            
            if i in temp_result[i] and len(temp_result[i])>=2:                                
                answer = False
                end = True
                break
        if end == True or test > maximum:
            break
        #이 경우 해당 길이에서 탐색이 실패하였으므로, 길이를 1늘려서 반복합니다.
        else:
            test = test +1
    return answer
728x90
반응형

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

소수 찾기  (0) 2021.07.04
동적계획법 - 멀리 뛰기  (0) 2021.06.28
스택 - 주식가격  (0) 2021.06.06
탐욕법 - 조이스틱  (0) 2021.06.02
매운음식 성애자(Way Cruel)  (0) 2021.05.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함