프로그래머스 전화번호 목록(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을 사용한다!

좋은 웹페이지 즐겨찾기