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

Hank Kim·2022년 3월 4일
0

알고리즘 문제풀이

목록 보기
13/24
post-thumbnail

문제 설명

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

제한 사항

phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.

문제풀이

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book)-1):
        if len(phone_book[i]) < len(phone_book[i+1]):
            if phone_book[i + 1][:len(phone_book[i])] == phone_book[i]:
                answer = False
                break
    return answer

문자열을 정렬했을때 어떤 순서로 정렬되는지를 이해해야한다.

list1=["1","10","3","22","23","4","2","200","011123123"]
for item in list1:
    item=int(item)

list1.sort()
print list1

결과

['011123123','1', '10', '2', '200', '22', '23', '3', '4']

숫자 리스트를 정렬하면 오름차순으로 정렬하지만,
숫자로 된 문자열 리스트를 정렬하면 숫자의 순서에 따라서 리스트를 정렬한다.
숫자크기에 상관없이 문자열의 첫번째 원소의 순서를 따라서 정렬하고 첫번째 숫자가 같으면 두번째...
이런식으로 정렬한다.
알파벳 문자열이 들어오는 경우 사전처럼 알파벳 순서대로 정렬한다.

만약 길이순서로 정렬하고싶다면
arr.sort(key = len)
숫자크기로 정렬하고 싶다면
arr.sort(key = int) 쓰면된다.

array.sort(key = lambda x:x[1])
print(array)
>>>>[[50, 'apple'], [30, 'banana'], [400, 'melon']]

이런식으로 키를 지정해서 문자열을 정렬할 수도 있다.

문제에서도 숫자로 된 문자열 리스트를 정렬할 때 숫자 순서를 기준으로 정렬하므로 만약 접두사가 되는 숫자가 있다면 해당 숫자의 바로 다음 숫자가 될 것이다.
따라서 정렬해서 뒤의 원소가 길이가 더 짧으면 서로 비교하고 같으면 False를 return하게 한다.

풀면서 헷갈렸던것

파이썬은 tmp필요없이
phone_book[i],phone_book[0] = phone_book[0],phone_book[i]
이렇게 서로의 값을 바꿀 수 있다

short = phone_book[0]
이렇게 short에 list의 원소를 저장하고 short의 값을 바꿔도 list에는 영향이 없다

모든 원소의 다음 원소 탐색할때 인덱스 에러 안 나려면
for i in range(len(phone_book)-1)
len에서 1 뺀값을 사용하면 된다.

profile
JavaScript, Python Algorithm

0개의 댓글