all, count, Counter

Leejaegun·2025년 3월 17일

코딩테스트 시리즈

목록 보기
17/49

1. all() 함수

all(iterable)

iterable 안의 모든 요소가 True이면 True를 반환하고, 하나라도 False이면 False를 반환하는 내장 함수.
예제:

print(all([True, True, True]))  # True
print(all([True, False, True]))  # False
print(all([]))  # 빈 iterable은 기본적으로 True

2. .count(num)

리스트(list)의 내장 메서드로, 특정 값이 리스트에서 몇 번 등장하는지 반환함.
예제:

nums = [1, 2, 2, 3, 3, 3]
print(nums.count(2))  # 2
print(nums.count(3))  # 3
print(nums.count(4))  # 0

3. from collections import Counter 와 차이점

from collections import Counter

Counter는 리스트의 각 원소 개수를 더 효율적으로 세는 dict 형태의 자료구조.
.count(num)는 리스트 전체를 한 번 순회하며 num을 찾지만, Counter는 한 번만 전체 순회한 뒤 각 요소의 빈도를 저장하므로 더 효율적임.
예제 비교
.count()

nums = [1, 2, 2, 3, 3, 3]
print(nums.count(2))  # 2
print(nums.count(3))  # 3

nums.count(2)를 실행하면 nums를 처음부터 끝까지 돌면서 2의 개수를 세고,
nums.count(3)를 실행하면 또 다시 처음부터 끝까지 돌면서 3의 개수를 셈. (비효율적)

Counter

from collections import Counter

nums = [1, 2, 2, 3, 3, 3]
counter = Counter(nums)
print(counter[2])  # 2
print(counter[3])  # 3

Counter(nums)는 한 번만 리스트를 순회하여 각 숫자의 개수를 저장한 후, O(1) 시간에 counter[2]나 counter[3]을 가져올 수 있음.

4. 원래 코드 분석

all(nums.count(num) % 2 == 0 for num in set(nums))
set(nums): 중복을 제거한 nums의 고유 원소 집합.
nums.count(num): num이 리스트에서 몇 번 등장하는지 반환.
nums.count(num) % 2 == 0: num의 개수가 짝수인지 확인.

all(...): 모든 숫자가 짝수 개수로 존재하면 True, 하나라도 홀수 개수면 False.
예제:

nums = [1, 2, 2, 3, 3, 3]
print(all(nums.count(num) % 2 == 0 for num in set(nums)))  # False (3이 홀수 개)
nums = [1, 1, 2, 2, 3, 3, 3, 3]
print(all(nums.count(num) % 2 == 0 for num in set(nums)))  # True (모든 숫자가 짝수 개)

5. Counter를 활용한 더 효율적인 코드

from collections import Counter

nums = [1, 2, 2, 3, 3, 3]
counter = Counter(nums)
print(all(count % 2 == 0 for count in counter.values()))  # False

Counter(nums).values()는 모든 숫자의 개수를 리스트로 반환하므로 nums.count(num)을 여러 번 호출하는 비효율성을 없앨 수 있음.
set(nums)를 만들 필요 없이 바로 카운팅 가능.

6. 최종 결론

.count(num)은 리스트를 매번 순회하므로 비효율적.
Counter를 사용하면 한 번만 순회 후 O(1) 조회 가능 → 성능 개선됨.

profile
Lee_AA

0개의 댓글