이숭간 공부기록

백준 5052번 파이썬 _ 전화번호 목록 본문

알고리즘/백준

백준 5052번 파이썬 _ 전화번호 목록

이숭간 2021. 2. 12. 23:52
728x90

www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

문제유형 : 문자열, 정렬, 해시

 

문제핵심 :

1. 파이썬 라이브러리 startswith메소드

2. 전화번호 배열을 정렬하면 접두어가 있는경우 같은번호로 시작하는 번호들은 무조건 인접하게 위치한다!!

3. zip()함수 : 파이썬 내장함수인 zip()은 동일한 개수로 이루어진 자료형을 묶어주는 역할을 하는 함수다.

(동일한개수 아니여도 됨 _ 더작은 개수에 맞춰서 짝짓기됨,

즉 길이다른 김밥두줄을 생각하고 시작부분은 동일하게 맞춘뒤 꽁다리는 버리고 슬라이스한다고 생각)

 

김밥비유 : http://pyengine.blogspot.com/2014/03/python-zip.html

  • zip()함수 사용 예시 
# zip()함수로 리스트 만들기

Number = [1,2,3,4]
Name = ['hong','gil','dong','nice']
Number_Name = list(zip(Number,name))
print(Number_Name)

'''
결과 : [(1 ,'hong'), (2 ,'gil'), (3 ,'dong'), (4 ,'nice')]
'''
# zip()함수로 딕셔너리 만들기

Number = [1,2,3,4]
Name = ['hong','gil','dong','nim']
dic = {}
for number , name in zip(Number,Name): 
    dic[number] = name
print(dic)
'''
결과 : {1 : 'hong' , 2 : 'gil' , 3 : 'dong' , 4 : 'nim'}
'''

 

정답 코드:

import sys
input = sys.stdin.readline

def solution(phone_Book):
    sorted_phone = sorted(phone_Book) # 전화번호 배열을 정렬하고 

    for p1, p2 in zip(sorted_phone, sorted_phone[1:]): # zip()을 이용해 인접한 두 원소를 비교
        if p2.startswith(p1):  # 접두어가 있으면 (접두어가 되는것이 접두어로 시작하는 수의 항상 앞에 위치하므로)
            return 'NO' 
    return 'YES' #접두어 없으면 

t = int(input())

for i in range(t):
    n = int(input())
    phone_book = list(input().strip() for _ in range(n))
    print(solution(phone_book))