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)의 시간복잡도를 한번 형성한다.

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

 

반성하자.

 

'Algorithm > acmicpc.net' 카테고리의 다른 글

최대공약수 GCD(Greatest Common Division)  (0) 2021.12.02
0의 개수  (0) 2021.11.30
익숙해지기 참 어려운 소수  (0) 2021.11.28
EOFerror : 입력이 끝날 때 종료를 원한다면!..  (0) 2021.11.25
후위 표기식  (0) 2021.11.24