[ BOJ / Python ] 5052번 전화번호 목록

황승환·2022년 6월 16일
0

Python

목록 보기
327/498


이번 문제는 문자열 슬라이싱과 정렬을 통해 해결하였다. 우선 전화번호들을 입력 받을 때, 전화번호들을 전화번호의 오름차순으로, 길이의 오름차순으로 정렬하였다. 이렇게 정렬을 한 이유는 2중 for문으로 전화번호들을 비교하는 과정에서 현재 전화번호의 앞부분이 표준이 된 전화번호보다 클 경우에 가지치기를 할 수 있기 때문이다. 이 조건을 통과한 경우에만 표준 전화번호와 현재 전화번호의 슬라이싱 값을 비교하여 같을 경우에 정답 변수를 바로 False로 변환하고, 반복문을 종료시킨다. 바깥쪽 for문에서도 answer가 False일 경우 반복문을 종료하도록 하여 최대한 최적화 시켰다.

Code

t=int(input())
for _ in range(t):
    n=int(input())
    num_book=sorted([str(input()) for _ in range(n)], key=lambda x:(x, len(x)))
    answer=True
    for i in range(n-1):
        for j in range(i+1, n):
            if len(num_book[i])>len(num_book[j]):
                continue
            if int(num_book[i])<int(num_book[j][:len(num_book[i])]):
                break
            if num_book[i]==num_book[j][:len(num_book[i])]:
                answer=False
                break
        if not answer:
            break
    if not answer:
        print("NO")
    else:
        print("YES")

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글