문제 개요
양수 또는 음수로 이루어진 숫자 리스트 nums가 주어졌을 때, 배열에 포함된 모든 값의 등장 횟수가 서로 고유한지 확인하는 프로그램을 작성해야 합니다.
예시
입력이 다음과 같다고 가정해 보겠습니다.
nums = [6, 4, 2, 9, 4, 2, 2, 9, 9, 9]
이 경우 각 숫자의 등장 횟수는 다음과 같습니다.
- 6 → 1회
- 4 → 2회
- 2 → 3회
- 9 → 4회
모든 등장 횟수(1, 2, 3, 4)가 서로 중복되지 않으므로, 결과는 True입니다.
해결 접근 방식
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- 1단계: num_counts라는 맵을 생성하여 각 값과 해당 값의 등장 횟수를 저장합니다.
- 2단계: occurrences 변수에 num_counts의 모든 값(등장 횟수들)을 리스트 형태로 저장합니다.
- 3단계: occurrences의 전체 길이와 고유 요소의 개수가 같으면 True를, 같지 않으면 False를 반환합니다. 두 값이 같다는 것은 등장 횟수에 중복이 없다는 의미이기 때문입니다.
구현 예제
아래 코드는 Python의 collections.Counter를 활용한 구현 예시입니다. Counter는 리스트 내 각 요소의 등장 횟수를 자동으로 계산해 주는 매우 유용한 도구입니다.
from collections import Counter
class Solution:
def solve(self, nums):
num_counts = dict(Counter(nums))
occurrences = num_counts.values()
return len(occurrences) == len(set(occurrences))
ob = Solution()
nums = [6, 4, 2, 9, 4, 2, 2, 9, 9, 9]
print(ob.solve(nums))입력
[6, 4, 2, 9, 4, 2, 2, 9, 9, 9]
출력
True
코드 동작 원리
코드의 핵심 로직은 마지막 반환문에 있습니다. set()은 중복된 값을 제거하는 자료구조이므로, 등장 횟수 리스트를 set으로 변환했을 때 길이가 줄어들지 않는다면 모든 등장 횟수가 고유하다는 뜻입니다. 이처럼 Counter와 set을 조합하면 복잡한 반복문 없이도 간결하고 효율적으로 문제를 해결할 수 있습니다. 시간 복잡도는 O(n)으로, 리스트의 크기에 비례하여 선형적으로 증가합니다.