코딩테스트/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
아 문제 이해하느라 시간 다 갔네 ㅠ