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