본문 바로가기
Algorithm/Python

[프로그래머스] 전화번호 목록

by _sweep 2022. 1. 24.

문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/42577

 

 

📋 문제

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

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

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

 

 

👉 입력

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

 

 

👈출력

 

 

 

💡 사용된 개념

✔️ zip(*iterable)

이터러블한 객체를 인자로 받아 각 객체가 담고있는 원소를 튜플 형태로 차례로 접근할 수 있는 이터레이터를 반환한다.

이터러블한 객체 두 개를 대상으로 같은 인덱스에 담겨있는 원소들을 비교하는 작업에 쓰이는 함수라고 생각하면 이해하기 쉽다.

인자로 주어진 이터러블 객체의 길이가 서로 다른 경우 길이가 작은 이터러블 객체의 길이만큼 동작한다.

 

zip(iterator1, iterator2, iterator3 ...)

 

>>> list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]
>>> list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> list(zip("abc", "def"))
[('a', 'd'), ('b', 'e'), ('c', 'f')]

 

✔️ string.find()

인자로 주어진 value값이 처음 등장하는 인덱스를 반환한다.

값을 찾을 수 없는 경우에는 -1을 반환한다.

 

string.find(value, start, end)
  • value : 찾고자하는 대상 값. 
  • start : 옵션. 찾기 시작할 인덱스. 기본값은 0.
  • end : 옵션. 찾는 작업을 끝낼 인덱스. 기본값은 해당 문자열의 끝.

 

 

📝 풀이

def solution(phone_book):
    phone_book.sort()
    
    for prefix, number in zip(phone_book, phone_book[1:]):
        if number.find(prefix) == 0:
            return False
    return True

 

먼저 인자로 들어온 phone_book을 정렬해 주었다.

이후 zip 함수를 통해 phone_book의 0번째 인덱스와 phone_book의 1번째 인덱스부터 비교해 나가기 시작했다.

이때 number로 주어지는 값에 prefix가 있고 리턴된 값이 0이라면 number는 prefix라는 문자열로 시작하는 문자열이다.

따라서 if문 조건에 걸린다면 바로 False를 리턴시켰다.

만약 for문이 끝난다면 해당하는 값이 없다는 뜻이기 때문에 True를 리턴한다.

 

이전 문제를 풀고 다른 사람들의 풀이를 보다가 zip함수를 알게 되었다.

그래서 이번 문제를 풀면서 써봤는데 앞으로 자주 쓰게될 함수 중 하나인 것 같다.

 

def solution(phone_book):
    phone_book.sort()
    
    for prefix, number in zip(phone_book, phone_book[1:]):
        if number.startswith(prefix):
            return False
    return True

 

find() 메서드 대신 startswith() 메서드를 사용할 수도 있다.

얼마 전 js string method 정리하다가 봤었는데 파이썬에도 있는 줄은 몰라서 find를 썼다가 다른 사람들의 풀이를 보고 존재를 알게 되었다.

 

 

🔍 참조

zip https://wikidocs.net/32#zip

zip https://www.w3schools.com/python/ref_func_zip.asp

string.find https://www.w3schools.com/python/ref_string_find.asp

 

 

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

[LeetCode] Two Sum  (0) 2022.01.25
[프로그래머스] 베스트 앨범  (0) 2022.01.25
[프로그래머스] 위장  (0) 2022.01.24
[프로그래머스] 완주하지 못한 선수  (0) 2022.01.24
[문자열탐색] 문자열 압축  (0) 2021.12.10

댓글