1. 문제


2. 나의 풀이


단순하게 생각하여 정렬된 전화번호들을 for 문을 통하여 각각으로 시작하는 부분이 있는지

.startswith로 검사하여 존재한다면 count를 증가시켜 count가 2 이상 일 때 False를 출력하고

그 외에는 True를 출력하도록 하였다.

이는 정확도 테스트는 통과 하였지만 효율성 테스트를 통과하지 못하였다.

두 번의 for 문으로 phone_book을 전부 돌아가기 때문에 실패한 것 같다.

def solution(phone_book):
    phone_book.sort()
    for numbers in phone_book:
        count =0
        for x in phone_book:
            if x.startswith(numbers):
                count+=1
        if count >=2:
            return False
    return True

3. 다른 풀이


개념은 동일한데, zip을 사용하여 두 번의 for문을 적어주었던 것을 하나로 줄였다.

또한 p2는 phoneBook[1:]으로 반복문을 돌게 함으로 더욱 연산을 줄여 주었다.

def solution(phoneBook):
    phoneBook = sorted(phoneBook)

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True

4. 새로운 사실


zip을 사용하여 한번에 여러개의 변수를 짝지을 수 있다.

개수가 다르면 가장 작은 개수에 맞추어 zip 되고 나머지는 버린다.

for number, upper, lower in zip("123456", "ABCDE", "abcde"):
    print(number, upper, lower)
   
    # 1 A a
    # 2 B b
    # 3 C c
    # 4 D d
    # 5 E e 

zip을 사용하여 역으로 unzip할 수도 있다.

A=(1,2,3,4,5)
B=("A","B","C","D","E")
pairs= list(zip(A,B))
print(pairs)
#[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')]
C,D=zip(*pairs)
print(C,D)
#(1, 2, 3, 4, 5) ('A', 'B', 'C', 'D', 'E')

5. 출처


전화번호 목록

profile
배 터져 죽을 때까지

0개의 댓글