Algorithm/HackerRank

Recursive Digit Sum

Red_Horse 2025. 9. 19. 18:14

출처 : 해커 랭크

난이도 : 중간

알고리즘 : 재귀

 

 

우리는 정수의 상위 자릿수를 정의합니다.다음 규칙을 사용합니다.

정수가 주어졌을 때, 그 정수의 가장 큰 자리수를 찾아야 합니다 .

  • 만약에 x만 가지고있다 1숫자이면 그 슈퍼 숫자는 x.
  • 그렇지 않으면, 슈퍼 디지트 x는 각 자리수의 합의 상위 자리수와 같습니다. x.

예를 들어, 슈퍼 디지트 9875다음과 같이 계산됩니다.

	super_digit ( 9875 )    	9 + 8 + 7 + 5  =  29  
	super_digit ( 29 )  	2  +  9  =  11 
	super_digit ( 11 ) 		1  +  1  =  2 
	super_digit ( 2 ) 		=  2  


n = '9875'

k = 4

숫자 p문자열을 연결하여 생성됩니다 n,k 그래서 초기 p = 9875987598759875.

    superDigit ( p )  =  superDigit ( 9875987598759875 ) 
                  9 + 8 + 7 + 5 + 9 + 8 + 7 + 5 + 9 + 8 + 7 + 5 + 9 + 8 + 7 + 5  =  116 
    superDigit ( p )  =  superDigit ( 116 ) 
                  1 + 1 + 6  =  8 
    superDigit ( p )  =  슈퍼디지트 ( 8 )

모든 숫자 p합계하다 116. 의 숫자 116합계하다 8. 8숫자가 하나뿐이므로 슈퍼 숫자입니다.

기능 설명

아래 편집기에서 superDigit 함수를 완성하세요 . 계산된 superdigit을 정수로 반환해야 합니다.

superDigit에는 다음과 같은 매개변수가 있습니다.

  • 문자열 n: 정수의 문자열 표현
  • int k: 연결할 시간n 만들다p

보고

  • int: 의 슈퍼 n숫자 k반복타임스

입력 형식

첫 번째 줄에는 공백으로 구분된 두 개의 정수가 포함됩니다.그리고.

제약 조건

  • 1 ≤ n ≤10^1000000
  • 1 ≤ k ≤10^5

샘플 입력 0

148 3

샘플 출력 0

3

설명 0

여기 n = 148 그리고 k = 3, 그래서 p = 148148148.

super_digit(P) = super_digit(148148148) 
               = super_digit(1+4+8+1+4+8+1+4+8)
               = super_digit(39)
               = super_digit(3+9)
               = super_digit(12)
               = super_digit(1+2)
               = super_digit(3)
               = 3

샘플 입력 1

9875 4

샘플 출력 1

8

샘플 입력 2

123 3

샘플 출력 2

9

설명 2

여기 n = 123 그리고 k = 3, 그래서 p = 123123123.

super_digit(P) = super_digit(123123123) 
               = super_digit(1+2+3+1+2+3+1+2+3)
               = super_digit(18)
               = super_digit(1+8)
               = super_digit(9)
               = 9

 

----------------------------------------------------------------------------------------------------------------------------

 

문제 해독


주어진 문자열 숫자를 k만큼 반복해서 초기 문자열을 늘리고 각 자리수를 1의 자릿수로 덧셈을 하여 10보다 작은 수가 나올때의 값을 반환하는 문제

 

문제접근

초기값 세팅은 n의 각 자릿수를 더한 값 * k 로 계산 예) n = 123, 1+2+3 = 6, k = 3, 6*3 = 18(설명 2부분과 동일한 값확인)

각 자릿수를 더한 값이 10보다 작을때까지 재귀

 

public static int superDigit(string n, int k)
    {
        long digitSum = 0;
        foreach(char c in n)
        {
            digitSum += (c - '0');
        }
    
        long totalSum = digitSum * k;
    
        return super_digit_helper(totalSum);
    }

    private static int super_digit_helper(long number)
    {
        if(number < 10)
            return (int)number;
    
        long sum = 0;
        while(number > 0)
        {
            sum += number % 10;
            number /= 10;
        }
    
        return super_digit_helper(sum);
    }
    
    private static int[] GetSplitNumbers(int number)
    {
        int length = number.ToString().Length;
        int[] newNumbers = new int[length];
        
        for(int i = 0; i < length; i++)
        {
            newNumbers[i] = number % 10;
            number /= 10;
        }
        return newNumbers;
    }

'Algorithm > HackerRank' 카테고리의 다른 글

Walking the Approximate Longest Path  (0) 2025.09.19
Jesse and Cookies  (0) 2025.09.19
Connected Cells in a Grid  (0) 2025.09.19
Red Knight's Shortest Path  (0) 2025.09.19
The Coin Change Problem  (0) 2025.09.18