프로그래머스 전화번호 목록(Lv2)
문제
https://programmers.co.kr/learn/courses/30/lessons/42577
풀이
def solution(phone_book):
answer = True
phone_book.sort()
for i in range(len(phone_book)-1):
if phone_book[i+1].startswith(phone_book[i]) :
answer = False
break
return answer
결과
정리
사실 이문제는 못풀었다. 도저히 생각이안나서 그냥 찾아봤는데
내가 sort를 하면 포함관계인 전화번호는 바로 앞뒤로 배치된다는것을 생각 못했다.
나는 길이가 짧은순으로 정렬한다음에 쭉 비교하면서 포함관계를 찾아봐야할거라고 생각했는데 그러면 O(n) 안으로 할수가없어서 O(n)으로 할수있는법을 한참 찾다가 그냥 포기했다.
기본 정렬시 앞뒤로 배치된다는것만 생각했으면 아주 쉬운 문제인것같다.
새로 공부한것
lambda 정렬
새로공부한건 아니고 원래알던거긴한데 오랜만에 쓰려니 기억이안나서 문법 다시한번 공부했다.
물론 이문제 풀이에 이게 쓰이진않지만 초기에 잘못된 방향으로 풀고있을때 찾아보며 공부했던거라 적었다.
phone_book.sort(key=lambda x:len(x))
이렇게 하면 길이가 짧은순으로 배치, 뒤에 reverse = True 붙여주면 역순으로 배치다.
ZIP
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
다른 풀이 찾아보다보니 zip으로 푼게 있드라
이게 더 빠른가?.. 논리는 내가 쓴거랑 같은거긴한데 속도면에서 더 빠른지는 모르겠다
아마 빠르겠지?..
근데 일단 간지가 나서 공부해봤다
Number = [1,2,3,4]
Name = ['a','b','c','d']
dic = {}
for number , name in zip(Number,Name):
dic[number] = name
print(dic)
'''
결과 : {1 : 'a' , 2 : 'b' , 3 : 'c' , 4 : 'd'}
요렇게 두 배열을 한개씩 묶어준다.
zip쓰는 이유
name = ['a', 'b']
value = [1, 2]
for n, v in (name, value):
print(n, v)
이렇게하면
a b
1 2
이렇게 나온다
name = ['a', 'b']
value = [1, 2]
for n, v in zip(name, value):
print(n, v)
이렇게해야
a 1
b 2
이렇게 되므로 이럴때 zip을 사용한다!
Author And Source
이 문제에 관하여(프로그래머스 전화번호 목록(Lv2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kjo1130/프로그래머스-전화번호-목록Lv2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)