CodeWars 아흔 두 번째 문제
Updated:
Primes in numbers
public static String factors(int n) {
int num = 2;
int count = 0;
TreeMap<Integer, Integer> treeMap = new TreeMap<Integer, Integer>();
while(n > 1) {
if(n % num == 0) {
n = n / num;
count++;
} else {
num++;
count = 0;
}
if(count > 0) {
treeMap.put(num, count);
}
}
return makeResult(treeMap);
}
private static String makeResult(TreeMap<Integer, Integer> treeMap) {
Iterator<Integer> it = treeMap.keySet().iterator();
String result = "";
while(it.hasNext()) {
int key = it.next();
int count = treeMap.get(key);
result += "(" + (count == 1 ? key : key + "**" + count) + ")";
}
return result;
}
-
소인수 분해 문제이다.
- 소수를 어디에 저장해두는지가 하이라이트인것 같다.
- 단순히 Map을 사용하기에는 정렬이 안되고 List는 소수만 저장하고 소수가 몇 개 나오는지는 알 수가 없어서 TreeMap을 사용했다.
- 그러나 Best코드는 역시나 바로 String에 저장하거나 아님 List만 사용할 수 있었다.
- 월요일이라 머리가 안돌아가는듯
Best Code
public static String factors(int lst) {
String result = "";
for (int fac = 2; fac <= lst; ++fac) {
int count;
for (count = 0; lst % fac == 0; ++count) {
lst /= fac;
}
if (count > 0) {
result += "(" + fac + (count > 1 ? "**" + count : "") + ")";
}
}
return result;
}
public static String factors(int n) {
List<String> l = new ArrayList<String>();
for (int i = 2; i <= n; i++) {
int times = 0;
while (n % i == 0) {
n /= i;
times++;
}
if (times == 1) l.add(Integer.toString(i));
else if (times > 1) l.add(String.format("%d**%d", i, times));
}
return l.stream().collect(Collectors.joining(")(", "(", ")"));
}