ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 전화번호 목록 (파이썬)
    프로그래밍 (Programming)/알고리즘 (Algorithm) 2020. 8. 19. 18:13
    반응형

     

    안녕하세요. 오늘은 프로그래머스, 해시 카테고리에 있는 문제를 하나 소개하고자합니다.

    해당 문제는 https://programmers.co.kr/ 에서 풀어보실 수 있습니다.

     

    1. 문제 설명

     

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

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

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

     

    2. 제한 사항

     

    phone_book의 길이는 1 이상 1,000,000 이하입니다.

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

     

    3.  입출력 예제

     

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

     

    4. 입출력 예 설명

     

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

     

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

     

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

     

    5. 소스코드 (파이썬)

     

    def solution(phone_book):
        answer=True
    
        #접두어를 찾기 위해 정렬
        phone_book=sorted(phone_book)
    
        for i in range(len(phone_book)-1):
            if phone_book[i] in phone_book[i+1]:
                answer=False
                return answer
            else:
                return answer
                
    
    if __name__=='__main__':
        #test case1
        phone_book=["119", "97674223", "1195524421"]
        print(solution(phone_book))
    
        #test case2
        phone_book=["123", "456", "789"]
        print(solution(phone_book))
        
        #test case3
        phone_book=["12", "123", "123", "1235", "567", "88"]
        print(solution(phone_book))

     

    6. 풀이방법

     

    해당 문제는 문자열이 어떻게 정렬되는지를 알고 있으면 쉽게 풀 수 있습니다.

     

    문자열의 형태로 되어있는 번호들이 저장되어 있는 리스트(phone_book)를 입력값으로 받고 그 리스트를 정렬시킵니다. 

    만약 숫자의 형태가 정수였으면 작은 숫자부터 큰 숫자 순서로 정렬이 되었겠지만, 입력값이 문자열의 형태일 경우에는 그렇지 않습니다. 예를들어 숫자 1230과 932가 있을 때 정수형의 정렬은 932 -> 1230이겠지만 문자열의 정렬은 1과 9를 비교하기 때문에 1230 -> 932로 정렬이 될 것입니다.

     

    그러면 문제로 다시 돌어와서 설명을 이어가도록 하겠습니다. 첫번째 예시를 보시면 입력 리스트["119", "97674223", "1195524421"] 는 ["119", "1195524421", "97674223"] 로 정렬이 될 것입니다.

     

    그 다음은 for문을 돌면서 접두사가 있는지를 확인해주면 됩니다. 소스코드에서 phone_book[0]인 "119"는 phone_book[1]인 "1195524421" 안에 포함이 되기 때문에 접두사입니다. 따라서 answer가 False로 바뀌고 함수는 answer를 return해줍니다.

     

    두번째 예시에서는 for문을 모두 돌았지만 겹치는 숫자들이 없기 때문에 True를 return해줄 것입니다.

    세번째 예시는 첫번째와 비슷하기 때문에 스킵하도록 하겠습니다.

     

    요약하자면 숫자로 구성되어 있는 문자열의 정렬을 꼭 기억하시기 바랍니다.

     

    7. 결과

     

     

     

    반응형

    댓글

Designed by Tistory.