하루에 1문제씩 풀기.
한 문제당 30분씩은 고민하기.
왜 그렇게 풀었는지 공유하기.
하루라도 놓친다면 벌금은 1,000원
[3코1파] 2023.01.04~ (29일차)
[4코1파] 2023.01.13~ (20일차)
2023.02.01 [29일차]
프로그래머스 LV2.
전화번호 목록
https://school.programmers.co.kr/learn/courses/30/lessons/42577
문제 요약
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
알림
2021년 3월 4일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.
문제 풀이 방법
처음에는 리스트에 있는 문자열을 int형으로 바꾸고 순서대로 sort한 후에. 이중 for문을 이용해서 첫번째 인덱스에 있는 값의 길이에 맞춰 두번째 for문의 값을 인덱싱한후에 값이 같은 느낌으로 찾았다.
역시 한번에 되는 법이 없음
시간복잡도에서 에러가 나서 찾으면 break 문을 걸어줬는데
그래도 테스트 3개는 실패하고 시간초과 에러가 났다
서치해보다가 python의 startswih 함수도 써봤는데 시간초과가 나서,, 이 로직으로 풀면 안되겠구나 알게 되었음
해당 문제는 정렬, 해쉬, 트라이로 풀 수 있다고 한다.
나는 해쉬라고 되어있길래 해쉬 느낌의 풀이로 풀었다.
(누군가의 힌트 참고)
문자열을 slice를 다 한다.
모든 접두어를 dictionary 화해서 이 딕셔너리 key에 있으면 False, 없으면 True를 리턴하게 하면된다.
내 코드
def solution(phone_book):
p_dict = {}
answer = True
for p in phone_book:
for idx in range(1,len(p)):
p_dict[p[:idx]]= 1
for p in phone_book:
if p in p_dict:
answer= False
return answer
증빙
다른 사람 풀이
다른 새럼은 정렬을 이용한 듯이 풀었는데,,
이거는 이제 int형으로 바뀌면서 통과못한다고 함..
그래도 이런 아이디어~~가 있다니
화이썬의 startswith를 여기에 활용하면 되는구나 굿
여담
밥 머 거 야 딩