LeetCode 1399

도토코·2025년 4월 24일

알고리즘 문제 풀이

목록 보기
42/44

문제

You are given an integer n.

Each number from 1 to n is grouped according to the sum of its digits.

Return the number of groups that have the largest size.

문제(번역)

정수 n 이 주어집니다.

1부터 n까지의 각 숫자는 그 숫자의 자릿수 합(각 자리 숫자의 합) 에 따라 그룹으로 묶입니다.

가장 크기가 큰(가장 많은 숫자를 포함한) 그룹이 몇 개 인지 반환하세요.

예시

입력 : n = 13

  • 출력 : 4
  • 설명 : 1부터 13까지 숫자를 자릿수 합으로 묶으면 9개의 그룹이 생긴다.

[1,10], [2,11], [3,12], [4,13], [5], [6], [7], [8], [9]
이 중에서 크기가 2인 그룹이 4개 이므로 답은 4.

입력 : n = 2

  • 출력 : 2
  • 설명 : 자릿수 합으로 묶으면 [1], [2] 두 그룹이 생기며, 두 그룹 모두 크기 1로 서로 같으므로 답은 2이다.

class Solution:
    def countLargestGroup(self, n: int) -> int:
        cnt = [0] * 37 # 해당 자리수 합을 가진 숫자 갯수
        ans = 0 # 가장 큰 크기 그룹의 개수

        for i in range(1 , n + 1):
            ans = 0 # 가장 긴 완전 부분 집합의 개수를 기록
            x = i
            while x:
                ans += x % 10
                x //= 10
            cnt[ans] += 1
        
        largest_group = max(cnt)
        return cnt.count(largest_group)

코드 순서

각 단계 상세 해설

  • 버킷 초기화
    • 길이 37인 리스트 cnt; 인덱스 k ⇒ 자릿수 합 k.
  • 외부 루프
    • 차례로 1…n의 자릿수 합을 계산.
  • 변수 재사용 문제
    • ans를 0으로 리셋해 “이번 숫자의 자릿수 합”으로 사용.
      가독성을 위해 sum_digits 같은 새 변수명을 쓰는 것이 낫다.
  • 자릿수 합 계산
    • % 10으로 일의 자리 추출 → 누적 → //= 10으로 자리 이동.
  • 버킷 증가
    • 완성된 ans를 인덱스로 사용해 cnt[ans] += 1.
  • 가장 큰 그룹 크기
    • max(cnt)로 최대 빈도 추출.
  • 그 크기를 가진 그룹 수
    • cnt.count(max_val)로 값이 max_val인 원소 개수 카운트.

단계별, 값 변화 표(n = 13)

i (현재 숫자)ans 초기값x 초기값while 1회 (ans += x % 10, x //= 10)while 2회while 3회최종 ans (자릿수 합)cnt[ans] 증가 후
101ans = 1, x = 01cnt[1] = 1
202ans = 2, x = 02cnt[2] = 1
303ans = 3, x = 03cnt[3] = 1
404ans = 4, x = 04cnt[4] = 1
505ans = 5, x = 05cnt[5] = 1
606ans = 6, x = 06cnt[6] = 1
707ans = 7, x = 07cnt[7] = 1
808ans = 8, x = 08cnt[8] = 1
909ans = 9, x = 09cnt[9] = 1
10010ans = 0, x = 1ans = 1, x = 01cnt[1] = 2
11011ans = 1, x = 1ans = 2, x = 02cnt[2] = 2
12012ans = 2, x = 1ans = 3, x = 03cnt[3] = 2
13013ans = 3, x = 1ans = 4, x = 04cnt[4] = 2

최종 cnt 요약: 인덱스 1~4 는 2, 5~9 는 1 → largest_group = 2, cnt.count(2) = 4

profile
코(딩)(꿈)나무

0개의 댓글