출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

해시를 이용하여 푸는 문제라고 되어있는데, 해시가 무엇인지 아직 정확히 모르므로, 내가 생각한 방식으로 풀었다.

def solution(phone_book):
    for i in range(len(phone_book)):
        for j in range(len(phone_book)):
            if i!= j:
                if phone_book[i]+phone_book[j][len(phone_book[i]):] == phone_book[j]:
                    return False
                    break
    else:
        return True

효율성도 나쁘지 않고, 정확성도 다 맞는 풀이 방법이라 다른 사람의 풀이를 한번 보기로 했다.


다른 사람의 풀이

프로그래머스에서 가장 많은 좋아요를 받은 문제풀이이다

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

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

이 사람은 sorted() 함수를 통해 문자열들을 순서대로 정렬을 시킨 후, 가장 인접한 두 숫자들을 검사를 해주는 것이다. 이때, 이 문제를 푼 사람은 startswith() 함수를 사용하였는데, startswith()는 문자열이 특정문자로 시작하는지 여부를 알려준다. 두번째 인자를 넣음으로써 찾기 시작할 지점을 정할수있다.(여기서는 두번쨰 인자를 넣지 않음)

>>> s = '가나다라 마바사아 자차카타 파하'
>>> s.startswith('마',5)
True

이런식으로 사용하게 된다.


문제는 해시를 사용하여 푸는 것이라고 되어 있는데, 딕셔너리를 사용하여 푸는 것이다. 이렇게 푸는 것은 다음과 같다:

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

해시에 phone_book의 값들을 각각 저장 시켜주고, temp='' 라는 빈 문자열을 정의해주고, 이에 따라 temp를 새롭게 정의해주고 has_map안의 값들과 비교하면서 정답을 출력한다.