[프로그래머스 : 해시] 전화번호 목록

huga·2020년 9월 3일
2

코딩테스트

목록 보기
2/8

Level2 문제

<풀이 생각하기>

우선 사전 순서대로 정렬을 한 후 앞의 번호 길이를 기준으로 뒤에 있는 번호를 잘라서 비교하면 될 거라 생각했다. 아직 자바에 익숙한지 풀이를 생각해도 파이썬 코드로 옮기는게 생각보다 오래걸렸다.

<Python 코드>

def solution(phone_book):
    phone_book=sorted(phone_book) #String이므로 사전순으로 정렬된다.
    for i in range(len(phone_book)-1): #인덱스로 반복문 돌리기 맨마지막 요소는 제외 
        str = phone_book[i]
        if(str==phone_book[i+1][:len(str)]): #앞서 맨 마지막 인덱스 제외 안 하면 여기서 오류 걸림 
             return False

    return True

코드는 통과 됐지만 해시문제에 해시를 쓰지 않았기에 좋은 답은 아니다. 효율성도 좋지 않다.

<다른 사람들의 풀이 구경>

(1) 해시맵 딕셔너리를 이용한 풀이

def solution(phone_book):
    answer = True
    dic ={} #key,value형태의 딕셔너리이용
    for pNumber in phone_book:
        dic[pNumber] = 1 #key:폰번호 value:1
    for pNumber in phone_book: #각각 폰번호마다 검사
        temp=""
        for num in pNumber: #폰번호를 한글자로 쪼개서 반복문 "243"이면 "2" "4" "3"
            temp +=num #쪼갠 숫자를 반복문이 돌아갈 때마다 붙음  
            if temp in dic and temp!=pNumber: #딕셔녀리의 키로 존재하는지 검사
                answer = False
    return answer

해시 파트에 속한 문제니 해시를 잘 이용한 풀이다. 그나저나 스트링을 저절로 쪼개서 한글자씩 저절로 돌릴 수 있다니 파이썬은 정말 편하다.

(2) sort할 때 key를 이용해서 효율이 올라간 풀이

def solution(phone_book):
    phone_book.sort(key=lambda x: len(x)) #길이로 정렬 
    print(phone_book)
    for a in range(len(phone_book)): #리스트 기준요소를 반복문 돌리기
        for b in range(a+1, len(phone_book)): #기준 요소의 다음 요소부터 반복문 돌리기
            if phone_book[b][:len(phone_book[a])] == phone_book[a]: #다음 요소가 기준요소의 길이로 잘랐을때 값이 같으면 false
                return False
    return True

phone_book = sorted(phone_book, key= len)라고 써도 된다.

(3) 내장함수 zip을 사용한 풀이

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

    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1): #startswith()함수 배워갑니다...
            return False
    return True

level2인데도 고민하고 푸는데 꽤 오래 걸렸다... 다른 사람들 풀이를 보면 코드 길이가 짧아서 신기하다. 꾸준히 하다보면 언젠가 사고력이 늘 것이라고 믿는다! 화이팅!!

0개의 댓글