코딩테스트/HackerRank

[HackerRank] Recursive Digit Sum 📌

주니어주니 2023. 4. 7. 22:14

 

문제 

 

주어진 문자열 n과 정수 k를 이용해서 p라는 수를 만들고, p의 super digit 계산 

p는 n을 k번 반복한 수

 

 

 

 

 

내 풀이 (틀림) 

 

왜 틀린걸까요? 왜틀린건지 모르겠네 ... 

아 일단 문제 이해를 못하겠다 

 

k가 무슨 의미인지 이해가 안된다

 

    public static int superDigit(String n, int k) {
        
        int superDigit = 0;
        
        for(int i=1; i<=k; i++) {
            
            long num = Long.parseLong(n);
            int sum = 0; 
            
            while(num > 0) {
                sum += num%10;
                num /= 10;
            }
            
            n = Integer.toString(sum);
            
            if(n.length() == 1) {
                superDigit = Integer.parseInt(n);
            }
        }
        return superDigit;
    }

 

 

 

다른 사람 풀이 

 

 

public static int superDigit(String n, int k) {

    // 문자열의 길이가 1이면 그 값 반환
    if(n.length() == 1) {
        return Integer.parseInt(n);
    }

    // 문자열의 길이만큼 돌면서 각 자리수의 합 구하기
    // "148" -> 1 + 4 + 8
    long sum = 0;						// 숫자가 커질 수도 있으니까 long으로 받음
    for(int i=0; i<n.length(); i++) {
        sum += n.charAt(i) - '0';		// '1' -> 1
    }

    // ( 1 + 4 + 3 ) * k -> 문자열 변환
    String newN = Long.toString(sum*k);

    // 재귀함수, 앞으로는 문자열 1번만 반복하니까 k=1
    return superDigit(newN, 1);

}

 

 

 

맨 처음 문자열 n을 k번 반복한 수에 대한 super digit

(문자열이 반복되는게 중요한게 아니라, 이 숫자들의 합이 중요)

n="9875", k=4

"9875987598759875" 의 자리수의 합이 한자리수가 될 때까지

9 + 8 + 7 + 5 + 9 + 8 + 7 + 5 + 9 + 8 + 7 + 5 + 9 + 8 + 7 + 5 = ( 9 + 8 + 7 + 5 ) * 4 

 

1) 문자열 n의 각 자리수의 합을 구함

2) sum에 넣어줌

3) sum * k 

4) 숫자를 문자열로 변환

4) 재귀함수로 반복, 이때부터는 문자열을 반복하지 않으니까 k=1

 

 

 

 

아 문제 이해하느라 시간 다 갔네 ㅠ