Algorithm/acmicpc.net

count를 영리하게

winney916 2021. 11. 22. 14:50
728x90

리스트에 있는 원소의 개수를 각각 카운팅 해야하는 상황이 있다. 내가 택했던 방법은

 

nums = list(map(int, input().split()))
num_set = set(nums)
counts = dict()
for num in num_set:
    counts[num] = nums.count(num)

set을 구한 뒤, list에서 set을 count하는 형태였다. 근데 자꾸 시간초과가 나서 설마 이것 때문인가 하고 찾아보니

def list_to_set(l):
    s = set()
    # Repeat n times --> O(n)
    for x in l:
        # Add element to set --> O(1)
        s.add(x)
        
    return s

리스트 -> set으로 변환을 할 때에는, 일단 set을 선언한 뒤 리스트의 모든 원소를 때려박는 형태였던 것이다...

그러니 여기서 O(n)의 시간복잡도를 형성한다...

그 후 set의 모든 원소에 대해서 list에 count하니 set의 길이 * O(n)의 시간복잡도를 추가로 형성한다...

 

검색을 통해서 좋은 코드를 찾아보았다.

nums = list(map(int, input().split()))
counts = dict()
for num in nums:
    try:
        counts[num] += 1
    except:
        counts[num] = 0

카운트 후 딕셔너리를 만들기 까지 O(n)의 시간복잡도를 한번 형성한다.

정말 깔끔하고 잘 짰다고 생각되는 코드다.

 

반성하자.