Python 프로그래밍에서 nums라는 숫자 리스트가 주어졌을 때, 리스트 안에서 가장 자주 등장하는 요소를 찾고, 그 요소가 총 몇 번 나타나는지 빈도를 구하는 방법을 알아보겠습니다.
예를 들어 입력 리스트가 [1,5,8,5,6,3,2,45,7,5,8,7,1,4,6,8,9,10]이라면, 숫자 5가 세 번 등장하므로 출력 결과는 3이 됩니다.
알고리즘: 단계별 접근 방법
이 문제는 두 개의 중첩 반복문을 사용해 모든 요소 쌍을 서로 비교하는 방식으로 해결할 수 있습니다. 해결 과정은 다음과 같습니다.
- 최대 빈도를 저장할 변수 max를 0으로 초기화합니다.
- length 변수에 nums 리스트의 크기를 저장합니다.
- i를 0부터 length-2까지 반복합니다.
- count를 1로 초기화합니다.
- j를 i+1부터 length-1까지 반복합니다.
- nums[i]와 nums[j]가 같다면 count를 1 증가시킵니다.
- max가 count보다 작다면 max 값을 count로 갱신합니다.
- 모든 반복이 끝나면 max를 반환합니다.
아래 예제 코드를 통해 실제 구현 방법을 확인해 보겠습니다.
구현 예제
class Solution: def solve(self, nums): max = 0 length = len(nums) for i in range(0, length - 1): count = 1 for j in range(i + 1, length): if nums[i] == nums[j]: count += 1 if max < count: max = count return max ob = Solution() nums = [1,5,8,5,6,3,2,45,7,5,8,7,1,4,6,8,9,10] print(ob.solve(nums))
입력
[1,5,8,5,6,3,2,45,7,5,8,7,1,4,6,8,9,10]
출력
3
더 효율적인 방법: collections.Counter 활용
위 방식은 모든 요소 쌍을 비교하므로 시간 복잡도가 O(n²)입니다. 따라서 리스트의 크기가 커지면 성능이 크게 저하될 수 있습니다. Python 표준 라이브러리의 collections.Counter를 사용하면 O(n)의 시간 복잡도로 훨씬 간단하고 빠르게 해결할 수 있습니다.
from collections import Counter def solve(nums): counter = Counter(nums) return counter.most_common(1)[0][1] nums = [1,5,8,5,6,3,2,45,7,5,8,7,1,4,6,8,9,10] print(solve(nums)) # 출력: 3
Counter는 리스트 내 각 요소의 출현 횟수를 딕셔너리 형태로 계산해 주며, most_common(1) 메서드는 빈도가 가장 높은 요소를 (요소, 빈도) 형태의 튜플로 반환합니다. 따라서 [0][1] 인덱싱을 통해 최대 빈도 값만 손쉽게 추출할 수 있습니다. 실무에서는 대용량 데이터 처리 시 Counter 방식을 사용하는 것이 권장됩니다.