문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

 

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.


제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.

입출력 예제

phone book return
[119, 97674223, 1195524421] false
[123,456,789] true
[12,123,1235,567,88] false

입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


나의 풀이 : 오답

  1. 가장 작은 번호 찾기
  2. 가장 작은 번호와 앞에서부터 하나씩 비교하기
  3. 같은게 있다면 false
  4. 같은게 하나도 없다면 true
minimum_book = phone_book[0]
minimum_num = len(str(minimum_book))

def solution(phone_book):
    
    # 가장 작은 리스트, 리스트의 길이 찾기
    for i in phone_book: # 받은 리스트의 개수만큼 반복
        a = len(str(phone_book[i]))
        if a <= minimum_num:
            minimum_book = phone_book[i]
            minimum_num = len(str(minimum_book))
            
            # 여기서 가장 작은 것과 하나씩 비교해야한다.
        else : 
            minimum_book = phone_book[i+1]
            minimum_num = len(str(minimum_book))
    # 이렇게 하면 리스트의 길이가 가장 작은 것인데 중복되는 것은 찾지 못한다.
    # 작다면 그 후에 바로 비교해야한다.
 
    return minimum_book

시간내에 풀지 못하였다.

길이가 가장 작은 리스트를 찾는 과정을 반복문을 통해 만드려고 했다. 

가장 작은 리스트를 for문으로 찾는다고 하여도 그 for문 안에서 또 하나씩 비교하여 접두사를 찾아야 하므로 코드가 매우 복잡하게 될 것 같았다. 또한 길이가 가장 작은 것이 2개, 3개, 그 이상으로도 중복이 될 수 있으므로 내가 생각한 방법은 틀렸다.

 


다른 사람 풀이

 def solution(phone_book):
    phone_book.sort() # 정렬
    for p1, p2 in zip(phone_book, phone_book[1:]): # zip 으로 나눠서 p1과 p2에 넣는다.
        if p2.startswith(p1): # p1의 문자열이 p2의 문자열의 맨 앞에있다면 False 반환 
            return False
    return True

sort()를 통해 숫자를 오름차순으로 정렬할 수 있기 때문에 가장 작은 순서대로 정렬할 수 있다.

굳이 하나씩 비교하면서 리스트의 길이가 작은 수를 저장하고 또 그것을 순서대로 정렬할 필요가 없다.

 

zip()을 통해 하나씩 넣어준 후 비교할 수 있다. 두개의 리스트를 연결시킬 때 가장 효과적인 함수인 것 같다.

 

startswith()를 통해 문자열의 맨앞에 있다면 False를 반환하는 기능을 이용할 수 있다.

이미 sort()를 통해 정렬을 하였으므로 (첫번째, 두번째) (두번째, 세번째) (세번째, 네번째) ... 이렇게 비교하면 되기 때문에 startswith()함수를 이용하면 된다.


zip() 함수

zip() 은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.

아래와 같이 Number 와 Name이 있다고 한다. 이때 이 두개의 List를 하나의 연관된 리스트로 만들어야 한다고 하자. 그럼 아래와 같이 간단하게 만들수 있다.

Number = [1,2,3,4]
Name = ['hong','gil','dong','nim']
Number_Name = list(zip(Number,name))
print(Number_Name)

결과 : [(1 ,'hong'), (2 ,'gil'), (3 ,'dong'), (4 ,'nim')]

 

phone_book = [12, 23, 34]
for p1, p2 in zip(phone_book, phone_book[1:]):
    print(p1,p2)

결과 :

12 23

23 34

 

하나씩 넣어서 묶어준다.


startswith() 함수

startswith()은 내가 찾고자 하는 문자열A가 문자열B의 맨 앞에 있는지의 여부를 알려준다!

기본적으로는 문자열 B에 문자열 A가 맨 앞 있다면 True를 반환하고, 아니라면 False를 반환한다.

 

 

복사했습니다!