Persistent Bugger

Instructions

Write a function, persistence, that takes in a positive parameter num and returns its multiplicative persistence, which is the number of times you must multiply the digits in num until you reach a single digit.

For example:

1
2
3
4
5
6
7
persistence(39) == 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
// and 4 has only one digit

persistence(999) == 4 // because 9*9*9 = 729, 7*2*9 = 126,
// 1*2*6 = 12, and finally 1*2 = 2

persistence(4) == 0 // because 4 is already a one-digit number

My Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class PersistentBugger {
public static int persistence(long n) {
int count = 0;

while (n >= 10) {
n = getMultiplyOfDigits(n);
count++;
}

return count;
}

/**
* 각 자리수를 곱한 값을 가져옴
**/
public static long getMultiplyOfDigits(long n) {
int result = (int) n % 10;

while ((n /= 10) > 0) {
result *= n % 10;
}

return result;
}
}

Better Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PersistentBugger {
public static int persistence(long n) {
if (n / 10 == 0)
return 0;

long multiplyOfDigits = 1;

// 모든 자릿수를 곱한다.
for (long i = n; n != 0; n /= 10) {
multiplyOfDigits *= (n % 10);
}

return persistence(multiplyOfDigits) + 1;
}
}

Feeling

return에 recusive method와 +1로 count를 사용하지 않은 방식이 새로웠다.

그리고 for문을 이렇게 쓸 수도 있네…

다른 사람들의 답을 보고 있자면 요즘은 알고리즘 문제를 풀때 가독성 vs 문제해결성(?) 중에 뭐가 더 중요할까 생각이 든다.

Share