IT/알고리즘

프로그래머스 전화번호 목록

어센트 2020. 6. 12. 16:11

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

 

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

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

programmers.co.kr

해시 문제로 분류되어 있었지만 보자마자 생각난 이중 for 문으로 문제를 풀고 실패하면 다른 방법을 생각해봐야지 했는데 테스트 케이스에 모두 성공했다.

풀이방법

  1. 배열을 sort()를 통해 정렬
  2. 이중 포문을 이용해 모든 경우의 수 비교하면서 replace()로 문자열하나를 다른 문자열 하나가 포함되어 있다면 "T"로 그 문자열을 바꿔줌
  3. 만약 T가 replace를 사용한 그 문자열에 포함되어있다면 return False
  4. 포문을 탈출하면 return True

다른 사람의 풀이를 보고 zip과 startwith()에 대해서 배웠다. 그리고 문자열을 길이 순서대로 정렬하고 싶다면 sort(key = len)을 이용하면된다는 것을 알게되었다.

 

내 풀이

def solution(phone_book):
    phone_book.sort()
    for i in range(len(phone_book)):
        for j in range(i+1,len(phone_book)):
            temp = phone_book[j].replace(phone_book[i],"T") 
            if(temp.find("T") > -1):
                 return False
    return True

 

다른 사람 풀이

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

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

 

 

해시를 이용한 풀이

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