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(")(", "(", ")"));
}