[baekjoon] 전화번호 목록

김민서·2024년 1월 17일
0

알고리즘 문제풀이

목록 보기
37/47

링크텍스트
전화번호 목록이 주어졌을 때, 이 목록이 일관성이 있는지를 구하는 문제이다.
전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.
예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자

긴급전화: 911
상근: 97 625 999
선영: 91 12 54 2

문자열 정렬 방법에서 힌트를 얻어 해결하면 되는 문제이다.
파이썬의 sort 또는 sorted 를 이용해 정렬을 하게되면
기본적으로 첫번째 문자를 기준으로 정렬하고, 같으면 그 다음 문자를 기준으로, 또 같으면 그 다음 문자를 기준으로 정렬하게 된다.

따라서 한 번호가 다른 번호의 접두어라면, 배열을 정렬했을 때 그 두 번호는 인접해있다.

사실 처음부터 이 아이디어를 생각해내지 못해서 처음에 어렵게 돌아돌아 풀었는데 통과하지 못했었다.

아무튼 이를 코드로 나타내면 다음과 같다.

t = int(input())

for _ in range(t):
    n = int(input())

    numbers = []
    for _ in range(n):
        numbers.append(input())	# 문자열로 입력받음
    
    # 정렬한다.
    numbers.sort()

    is_consistency = 'YES'
    for i in range(len(numbers) - 1):
    	# numbers[i]와 그 다음 값의 numbers[i] 길이 만큼을 비교
        if numbers[i] == numbers[i+1][:len(numbers[i])]:
            is_consistency = 'NO'
            break
    
    print(is_consistency)

0개의 댓글