미소를뿌리는감자의 코딩

[백준 2024/02/22] 5052번 전화번호 목록 본문

코딩 테스트/백준

[백준 2024/02/22] 5052번 전화번호 목록

미뿌감 2024. 2. 22. 15:25
728x90

https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

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

www.acmicpc.net

 

1. 접근 방법

접두어인 경우가 없어야 한다는 점에 주목했다. 

따라서 2개의 수를 비교할 때, 어떤 수가 큰 수인지 작은 수 인지 판단을 하였다.

이후 큰 수를 앞에서부터 작은 수의 크기만큼 slice를 한 후, slice된 큰 수 == 작은 수 인지 확인해 주었다.

 

이후 2중 for문을 이용해서, 2개의 수를 받아와 주었다.

이때, sort()를 먼저하고 2개의 수를 받아와 준다면, 뒤에 있는 수가 무조건 큰 수 임을 알 수 있다.

for i in range(cases):
    for j in range(i+1, cases, 1):

위 코드에서는 nums[i] 가 작은 수, nums[j]가 큰 수 임을 알 수 있다. 물론, 둘의 length가 같을 수도 있다.

 

처음에는 sort()를 하지 않고, 2개의 수를 받아와서 각 경우마다 전화번호 크기를 비교해 줬었다. 하지만, 시간 초과가 나는 문제가 있었다.

이후, sort()를 한 후, 2개의 수 중 어떤 수가 더 큰 지 evaluate 하는 부분을 지워주니 맞힐 수 있었다.

 

2. 코드

def check_consistency(cases):
    nums = []

    for i in range(cases):
        nums.append(input())

    nums.sort() ## 이게 중요한 부분.

    for i in range(cases):
        for j in range(i+1, cases, 1):
            if nums[j][:len(nums[i])] == nums[i]:
                return 'NO'

    return 'YES'


def main():
    for _ in range(int(input())):
        cases = int(input())
        print(check_consistency(cases))


if __name__ == '__main__':
    main()
728x90