해시 - 전화번호 목록

1. 전화번호 목록

A. 📜 문제

위 프로그래머스 사이트에 접속하여 문제를 확인해주세요.

B. 💡 내 답안

a. 😅 1차 시도 (실패)

def solution(phone_book):
    """
    sort를 하면 문자열들(['1', '2', '3', '123', '24'])은 ['1', '123', '2', '24', '3'] 으로 정렬된다.
    그럼 현재 인덱스의 문자열과 다음 인덱스의 문자열을 비교하여 접두어인지 확인할 수 있다.
    """
    phone_book.sort()

    for i in range(len(phone_book) - 1):
        phone_len = len(phone_book[i])
        # 다음 인덱스의 문자열의 접두어가 현재 인덱스와 같은지 알기 위해서는
        # 다음 인덱스의 문자열에서 현재 인덱스의 길이만큼만 비교하면 알 수 있다.
        if phone_book[i] == phone_book[i + 1][:phone_len]:
            return False

    return True

b. 😊 2차 시도 (성공)

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

a. 🙄 회고

내 풀이

  • 다른 방법이 떠오르지 않아서 문자열 비교로 풀었다.

반성

  • zip()을 이용해서 비교하고자하는 문자열을 동시에 비교할 수 있다는 것을 생각하지 못했다.
  • 문자열의 startswitch()를 사용하여 쉽게 비교할 수 있다는 것을 잊고 있었다.

결론

  • 자주 사용하지 않으면 잊는다.

C. 🧐 문제 해설

이해한 내용을 바탕으로 작성했습니다.


In[16]: a
Out[16]: ['1', '123', '2', '24', '3']
In[17]: list(zip(a, a[1:]))
Out[17]: [('1', '123'), ('123', '2'), ('2', '24'), ('24', '3')]

zip()을 사용하면 인자값들 중 길이가 짧은 것만큼만 반환된다.

참고문헌

위클리 챌린지. 코딩테스트 연습 - 전화번호 목록 | 프로그래머스 (programmers.co.kr). Programmers. (accessed Dec 16, 2021)

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.