[프로그래머스-Hash] 전화번호 목록

CHOI YUN HO·2021년 1월 13일
0

알고리즘 문제풀이

목록 보기
4/63

📃 문제 설명

전화번호 목록

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

구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.

입출력 예

phone_bookreturn
[119, 97674223, 1195524421]false
[123,456,789]true
[12,123,1235,567,88]false

[문제 출처 : 프로그래머스]

👨‍💻 해결 방법

나의 생각의 흐름을 주절주절..

문자열 정렬에 대해서 생각해볼 수 있는 문제였다.

한 번호가 다른 번호의 접두어이면,
오름차순으로 정렬했을 때 두 문자열은 반드시 연속적으로 나타날 것이다.
내가 생각한 예시로는
"123", "124", "1234""123", "124", "1254"
뭐 이런게 있었는데,

첫 번째 경우는 오름차순으로 정렬하게 되면
"123", "1234", "124"이고,
두 번째 경우는
"123", "124", "1254"이 되므로

한 문자열이 다른 문자열의 접두어이면
오름차순으로 정렬했을 때 두 문자열은 반드시 연속적으로 나타난다.

결론

주어진 phone_book 리스트를 오름차순으로 정렬한 후에
인접해있는 문자열들을 확인해주면 되는데,
오름차순이기 때문에, 먼저 오는 문자열(i)이
두 번째 문자열(i+1)에서 접두어인지 확인한다.

두 번째 문자열에서 처음부터 먼저 오는 문자열의 길이만큼 자른 뒤
먼저 오는 문자열과 비교하면 된다 !!

👨‍💻 소스 코드

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(0, len(phone_book)-1):
        if phone_book[i] == phone_book[i + 1][:len(phone_book[i])]:
            answer = False
    return answer
profile
가재같은 사람

0개의 댓글