반응형
전화번호 목록
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사 입니다.
- 구조대 : 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 |
내 풀이
python이라는 언어를 공부할 겸 python을 사용해서 해당 문제를 풀기로 하였습니다. 일단 핵심은 아래와 같다고 생각했습니다.
- 한 번호가 다른 번호의 접두어인지 확인하는 과정
- 비교 시에 비교하려는 번호의 길이보다 짧은 모든 번호를 비교
그래서 다음과 같은 과정으로 해당 문제를 해결하였습니다.
- phone_book를 오름차순으로 sort() -> 문자열 같은 경우 sort할 시에 문자열 내의 글자 하나하나의 유니코드를 기준으로 정렬하게 됩니다.
- for문을 통해 startswith()로 비교하여 true일 시 false 리턴
- 모든 반복문을 통과했다면 True 리턴
(1) 의 예 같은 경우
["123","1235","12","88","567"] 를 정렬하면 ["12", "123", "1235", "567", "88"] 이렇게 정렬되어 앞뒤로만 비교를 해주면 됩니다.
코드 구현부
def solution(phone_book):
phone_book.sort()
for i in range(len(phone_book)-1):
if phone_book[i+1].startswith(phone_book[i]):
return False
return True
코드를 채점한 결과 아래와 같은 결과가 나왔다.
정확성: 83.3
효율성: 16.7
합계: 100.0 / 100.0
일단 효율성이 너무 나쁘다 생각하여 다른 사람들은 어떻게 했는지 참고해서 공부해보기로 하였습니다.
다른 사람들의 풀이
예시 1
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
위는 zip()이라는 함수를 사용하여 문제를 해결하였는데 zip()이라는 함수는 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수라고 합니다.
>>> zip([1,2,3], [4,5,6])
[(1, 4), (2, 5), (3, 6)]
예시 2
def solution(phone_book):
answer = True
hash_map = {}
for phone_number in phone_book:
hash_map[phone_number] = 1
for phone_number in phone_book:
temp = ""
for number in phone_number:
temp += number
if temp in hash_map and temp != phone_number:
answer = False
return answer
위의 예시는 본래 문제의 목적인 Hash를 이용해서 푼 문제인데 한번 공부해보면 좋을 것 같아 가져왔습니다.
반응형
'컴퓨터 공학 > 알고리즘' 카테고리의 다른 글
[알고리즘 / Kotlin] 프로그래머스 - (10주차)교점에 별 만들기 (0) | 2021.10.17 |
---|---|
[알고리즘 / Kotlin] 프로그래머스 - (8주차)최소직사각형 (0) | 2021.10.01 |
[알고리즘 / Kotlin] 프로그래머스 - 베스트앨범 (0) | 2021.09.24 |
[알고리즘 / Kotlin] 프로그래머스 - 다리를 지나는 트럭 (0) | 2021.09.15 |
[알고리즘 / Kotlin] 프로그래머스 - 위장(해시) (0) | 2021.09.03 |
댓글