Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 숫자의 모든 자릿수 빈도가 같은지 확인하는 방법

어떤 수 num이 주어졌을 때, 이 수가 균형 잡힌(balanced) 수인지 판별하는 문제를 생각해 봅시다. 여기서 균형 잡힌 수란 모든 자릿수의 등장 빈도가 서로 동일한 수를 의미합니다.

예를 들어 입력값이 num = 562256라고 해 보겠습니다. 이 수를 구성하는 자릿수는 5, 6, 2 세 종류뿐이며, 각각 정확히 두 번씩 등장합니다. 따라서 결과는 True가 됩니다.

해결 접근 방법

이 문제는 다음과 같은 단계로 해결할 수 있습니다.

  • 1단계: num을 문자열로 변환합니다. 문자열로 바꾸면 각 자릿수에 손쉽게 접근할 수 있습니다.
  • 2단계: 각 자릿수별 등장 횟수를 저장할 딕셔너리(freq)를 준비합니다.
  • 3단계: 딕셔너리의 값, 즉 각 빈도 값을 모두 모아 하나의 집합(freq_values)을 만듭니다. 집합은 중복 요소를 제거하므로, 모든 자릿수의 빈도가 동일하다면 이 집합의 크기는 반드시 1이 됩니다.
  • 4단계: freq_values의 크기가 1이면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

예제 코드

from collections import defaultdict

def solve(num):
    number = str(num)

    freq = defaultdict(int)
    n = len(number)

    for i in range(n):
        freq[int(number[i])] += 1

    freq_values = set(freq.values())

    if len(freq_values) == 1:
        return True
    return False

num = 562256
print(solve(num))

실행 결과

입력

562256

출력

True

코드 상세 설명

defaultdict(int)는 존재하지 않는 키에 접근할 때 자동으로 기본값 0을 생성해 주므로, 빈도를 셀 때마다 키의 존재 여부를 확인할 필요가 없습니다. 반복문에서는 각 자릿수를 정수로 변환한 뒤 해당 키의 값을 1씩 증가시킵니다. 마지막으로 set(freq.values())를 통해 서로 다른 빈도 값만 남기는데, 이 집합의 크기가 1이라면 모든 자릿수의 빈도가 동일하다는 의미입니다.

더 간결한 대안: Counter 활용

파이썬의 collections.Counter를 사용하면 동일한 로직을 훨씬 짧은 코드로 구현할 수 있습니다.

from collections import Counter

def solve(num):
    return len(set(Counter(str(num)).values())) == 1

num = 562256
print(solve(num))

복잡도 분석

숫자의 자릿수를 d라고 할 때, 시간 복잡도는 O(d)입니다. 자릿수의 종류는 최대 10개(0부터 9까지)이므로, 빈도를 저장하는 데 필요한 추가 메모리 역시 O(1)로 일정하게 유지됩니다.