[programmers] 전화번호목록

resilient

·

2021. 8. 16. 20:23

728x90
반응형

해시 알고리즘은 개발할 때 필수적으로 알아야 할 알고리즘이다.

해시 알고리즘 문제도 자주 접하면서 친해질 필요가 있다고 생각한다.

전화번호 목록은 프로그래머스에 있는 코딩 테스트 연습에서 해시 카테고리에 있는 문제이다.

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

 

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

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

programmers.co.kr

  • 이 문제를 읽고 생각을 했다. 해시가 어떤 구조인지... 어떻게 사용해야 하는지...
    파이썬에서는 딕셔너리라는 아주 좋은 해시 자료구조를 제공해주기 때문에 이를 사용해서 구현했다.
  • hash_map이라는 딕셔너리를 만들어주고 for문으로 탐색하면서 숫자 str값의 key와 value 1을 가진 원소들을 만들어준다.
  • 다음으로는 딕셔너리 안에 같은 번호가 있는지 확인하기 위해 for문으로 숫자들을 꺼내고 temp라는 빈 문자열을 만든 뒤, 꺼낸 숫자를 또 쪼개서 하나씩 하나씩 temp라는 문자열에 추가해준다.
  • 만약에 이렇게 만들어진 temp라는 문자열과 같은 문자열이 hash_map에 있을 때, 만약 꺼냈던 숫자와 다른 경우가 같은 번호가 들어가 있다고 생각할 수 있다.
def solution(phone_book):
    answer = True
    hash_map = {}
    
    # 등장한 숫자들을 count 딕셔너리로 만듦
    for phone_number in phone_book:
        hash_map[phone_number] = 1
        
    # 다시 숫자들을 꺼낸뒤
    for phone_number in phone_book:
        temp = ""
        for number in phone_number: #숫자 하나씩 뜯어보기
            temp += number
            #딕셔너리 키로 같은게 있지만! 전체 숫자는 다른 경우!
            if temp in hash_map and temp != phone_number:
                answer = False
                
    #print(hash_map)
    return answer

print(solution(["119", "97674223", "1195524421"]))
반응형