본문 바로가기
Algorithm/프로그래머스

Lv2 전화번호 목록

by IT learning 2021. 6. 17.
728x90

 

문제 설명

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

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

문제 풀이

처음에는 정렬해서 뭐 문제 풀고 그랬었는데, 이 문제의 카테고리가 해시에 존재한다. 따라서 해시로 문제를 풀어보았다.(다른 사람의 풀이를 보고 이해해봤다)

 

일단 이 문제 풀이의 핵심 단문들이다.

  • 해시를 통해 지금 있는 번호들을 저장시킨다.
  • 후에 번호를 하나씩 추가시키며, 해시에 위치해 있는지 따져본다.
  • 해시에는 있지만, 그 수가 동일한 수가 아닐 경우, 중복이된 수 이므로 False 리턴

코드

def solution(phone_book):
    answer = True
    # 해시 테이블 생성 (딕셔너리)
    hash_map = {}
    # 먼저 딕셔너리에 각 번호들을 추가
    for i in phone_book:
        hash_map[i] = 1
    
    # 번호 하나하나씩 빼서
    for phone_number in phone_book:
        tmp = ""
        for number in phone_number:
            # 한글자씩 추가해서 딕셔너리에 존재하는지 비교
            tmp += number
            # 만일 딕셔너리에는 있는데, 지금 뽑은 수랑 다르다면 그건 중복되는 수
            if tmp in hash_map and tmp != phone_number:
                # 따라서 False 변경
                answer = False
    return answer

해시 테이블을 생성하고, 하나씩 빼서 같은 값이 나올때까지 tmp라는 임시 변수에 저장시켜준다. 그리고 딕셔너리에는 존재하는 번호를 찾았는데, 현재 하나 뽑아서 tmp에 저장시키고 있는 수랑 다르다면 중복되는 수이니 False로 저장 시켜준다.

 

이게 무슨 말이냐면, 

phone_book return
["119", "97674223", "1195524421"] false

위와 같은 리스트가 있다. 각각 119, 97674223, 1195524421 숫자가 존재하는데, 위 코드로 살펴볼경우 119 먼저 볼 것이다.

119 숫자는 해시에 존재는 한다. 하지만, and 뒤에 나오는 코드, 현재 뽑은 수랑 tmp의 수가 다른가? 라는 조건에는 해당되지 않기 때문에 그냥 이어나간다. 하지만 뒤에 숫자가 문제다.

 

뒤에 1195524421 가 나온다. 이 수를 뽑아서 하나씩 tmp에 옮기기 시작한다. 그러다 tmp 가 119가 될시에 아래 조건은 발동된다.

다시 tmp 가 해시에 존재한다. 그리고 지금 tmp 의 수와 우리가 뽑은 수 1195524421 랑은 다르기 때문에, 이 수는 중복된다 라고 볼 수 있다. 따라서 자연스레 들어가서 False 를 저장시켜준다.

 

코드는 이렇게 진행된다.

 

이중 for 문이 존재해서 효율성에 걸릴줄 알았지만, 다행히도 잘 넘어갔다.

 

 

문제를 풀고 배운점

해시를 이용해 문제를 푸는게 아직 익숙하지가 않은데, 해시를 어떻게 사용해야 할지 감을 조금은 잡아준 문제라고 생각한다. 특히나 파이썬의 딕셔너리는 해시 문제를 풀기에는 정말 좋은 기능인듯 하다. 여러 문제를 더 많이 풀어봐야 할 듯 하다.

728x90

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

Lv1 신규 아이디 추천  (0) 2021.06.21
Lv1 폰켓몬  (0) 2021.06.21
Lv 2 주식가격  (0) 2021.06.18
Lv1 완주하지 못한 선수  (0) 2021.06.17
2020 카카오 인턴 - 키패드 누르기  (0) 2021.05.05

댓글

IT_learning's Commit