Algorithm/Programmers

[Programmers] 코딩테스트 연습 > Hash > 전화번호 목록

메린지 2023. 3. 30. 22:28

[문제 설명]

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

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

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

 

[제한 사항]

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

[풀이]

Lv 2 문제라 그런지, 해시 문제라 시간이 중요해서 그런지!!

유효성 테스트까지 있어서 살짝 귀찮았다ㅠㅠ

일단 해시 문제에 걸맞게 딕셔너리로 풀려고 해서 저장을 하고,

번호 순서대로 소팅을 함.

 

그럼 이제 하나씩 확인 가능한데이제 소팅햇을 때 유사한 것끼리 1부터 나오고 길이는 상관없음.따라서 유사한 것끼리 붙어있는 구조가 됨.그래서 전 후를 비교하는 거였는데, startwith() 메소드를 쓴사람도 많고 이게 더 빠르다고 함.

 

내 코드에서 뭔가 이렇게 하면 첫번째 꺼랑 세번째꺼랑 같으면 어떡해!! 할수도 있다. (사실 나만 그랬을수도 ㅋ,ㅋ)

예시를 들자[119, 1191, 1192, ... ] -> 문제 없음

[1192, 19, 1923, ... ] -> 문제 없음

그렇다,, 길이가 상관없어져서 상관이 없는 문제였다 굿>_0

def solution(phone_book):
    phone_book = sorted(phone_book)
    phone_dict = {}
    for i, number in enumerate(phone_book):
        phone_dict[i] = number
    
    for i in range(len(phone_dict)-1):
        if phone_dict[i] == phone_dict[i+1][:len(phone_dict[i])]:
            return False  
    return True