전화번호 목록 - 프로그래머스
2020. 12. 28. 16:28ㆍ개발 잡부/알고리즘
728x90
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
간단하게 요악하면 '누군가의 전화번호가 다른 누군가의 전화번호로 시작하는가?' 이다.
내 해결 방법은 이렇다.
- 전화번호 목록을 정렬한다.
- 연속된 전화번호의 뒷 전화번호가 앞 전화번호로 시작하는지 확인한다.
만약, ['112', '248', '11257']이 입력이라면, 정렬했을 때 ['112', '11257', '248']이 된다.
정렬 기준상 한 숫자가 다른 숫자의 시작이라면, 더 길이가 짧은 쪽이 앞으로 온다. 왜냐하면 비교도중 문자열이 남아있으면 더 큰 값으로 처리되기 때문이다. 이를 이용하여 앞숫자가 뒷숫자의 시작인지 확인하면 된다.
위의 해결 방법을 코드로 해결하기 위한 순서는 다음과 같다.
- 전화번호 목록을 정렬한다.
- 모든 자리에 대하여 다음을 실행한다. (마지막 자리는 제외한다. 다음 데이터가 없기 때문)
- 다음 자리의 데이터가 해당 자리의 데이터로 시작하는지 확인한다.
- 2-1을 만족한다면 false를 반환한다.
- 모든 자리에 대하여 만족하지 않았다면 true를 반환한다.
위의 순서를 코드로 작성하면 다음과 같다.
def solution(phone_book):
answer = True
# 1. 전화번호 목록을 정렬한다.
phone_book = sorted(phone_book)
# 2. 모든 자리에 대하여 (마지막 자리 제외)
for i in range(len(phone_book) - 1):
# 2-1. 뒷숫자가 앞숫자로 시작하는지 확인한다
if phone_book[i + 1].startswith(phone_book[i]):
# 2-2. 만족할 경우, false를 반환한다.
answer = False
break
# 3. 모든 자리에 대하여 만족하지 않을 경우 true를 반환한다
return answer
'개발 잡부 > 알고리즘' 카테고리의 다른 글
Unique Paths III - DFS 알고리즘 (0) | 2021.11.02 |
---|---|
Surrounded Regions - BFS 알고리즘 (0) | 2021.11.02 |
주식가격 - 프로그래머스 (0) | 2020.12.31 |
위장 - 프로그래머스 (0) | 2020.12.28 |
완주하지 못한 선수 - 프로그래머스 (0) | 2020.12.28 |