본문 바로가기
Algorithm/programmers

[프로그래머스] 42577 | 전화번호 목록

by 밤초록 2022. 1. 7.
42577 | 전화번호 목록 | Lv.2
https://programmers.co.kr/learn/courses/30/lessons/42577

 

 

 

작성 코드

 

def solution(phone_book):
    answer = True
    phone_book.sort()
    for idx1, pb1 in enumerate(phone_book):
        for idx2 in range(idx1 + 1, len(phone_book)):
            if pb1 == phone_book[idx2][:len(pb1)]:
                answer = False
    return answer

 

  • sort 한 후 for 문 두 번 도느라 시간 초과

 

 

이상 코드

 

index 비교

 

def solution(phone_book):
    answer = True
    phone_book.sort()
    for idx in range(len(phone_book) - 1):
        if phone_book[idx + 1][:len(phone_book[idx])] == phone_book[idx]:
            return False
    return answer

 

  • phone_book 배열 내 원소의 자료형이 정수가 아닌 문자열 + 중복이 없기 때문에 정렬을 했을 때 사전순 배열 -> 바로 뒤 원소와 비교하면 됩니다
  • 만약 배열 내 원소의 자료형이 정수형이더라도 map을 통해 문자열로 변환해주었으면 해결됐을 것

 

 

startwith 함수 사용

 

def solution(phone_book):
    phoneBook = sorted(phoneBook)

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True

 

  • zip 은 두 배열의 길이가 달라도 사용 가능, 짧은 쪽에 길이 맞춤
  • startiwith 를 사용하면 True, False 값 return

 

 

해시 함수 사용

 

def solution(phone_book):
    hash_map = {}
    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:
                return False
    return True

 

  • 딕셔너리는 in 연산을 수행할 때 배열보다 효율적
  • temp != phone_number 조건을 잘 생각해내기

 

 

학습

 

  • 자료형도 hint일 수 있으니 대충 넘기지 말 것
  • zip 은 배열의 길이가 달라도 사용 가능
  • startwith 함수의 사용

 

반응형

댓글