문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 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입니다.
나의 풀이 : 오답
- 가장 작은 번호 찾기
- 가장 작은 번호와 앞에서부터 하나씩 비교하기
- 같은게 있다면 false
- 같은게 하나도 없다면 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를 반환한다.
'⏰ 코딩테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 2단계 - 소수 만들기 (0) | 2021.01.19 |
---|---|
프로그래머스 2단계 - 짝지어 제거하기 (0) | 2021.01.18 |
프로그래머스 2단계 - 행렬 곱 (0) | 2021.01.14 |
프로그래머스 2단계 - 피보나치 (0) | 2021.01.13 |
프로그래머스 1단계 (0) | 2020.09.24 |