기술/Algorithm
카카오 코딩테스트 2번
leatherjean
2018. 9. 17. 03:15
x
import java.util.*;
public class kakao_2 {
public int[] solution(int N, int[] users) {
List<Integer> answer = new ArrayList<>();
Map<Integer, Integer> stages = new HashMap<>(); // 해당 스테이지에 위치한 사람 숫자
Map<Integer, Integer> clearStages = new HashMap<>(); // 해당 스테이지 클리어한 사람 숫자
Map<Integer, Double> result = new TreeMap<>();
for (int i = 0; i < users.length; i++) {
if (stages.containsKey(users[i])) {
stages.put(users[i], stages.get(users[i]) + 1);
} else if (!stages.containsKey(users[i])) {
stages.put(users[i], 1);
}
}
for (int i = N + 1; i >= 1; i--) {
if (!stages.containsKey(i)) {
stages.put(i, 0);
}
if (i == N + 1 && stages.containsKey(i)) {
clearStages.put(i, stages.get(i));
} else if (stages.containsKey(i) && i != N + 1) {
clearStages.put(i, clearStages.get(i + 1) + stages.get(i));
}
}
for (int i = 1; i <= N; i++) {
if (clearStages.containsKey(i)) {
if (clearStages.get(i) != 0) {
result.put(i, (double) stages.get(i) / clearStages.get(i));
} else {
result.put(i, 0.0);
}
} else {
result.put(i, 0.0);
}
}
Iterator iterator = sortByValue(result).iterator();
while (iterator.hasNext()) {
answer.add((int) iterator.next());
}
return answer.stream().mapToInt(Integer::valueOf).toArray();
}
public static List sortByValue(final Map map) {
List<String> list = new ArrayList();
list.addAll(map.keySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return list;
}
}
카카오 블라인드 테스트 2번문제를 풀어보았다. 문제는 어떤 게임의 스테이지 실패율 순위 출력 내용이었다. 요즘 Map 사용에 취미가 생겼는지 이것도 Map으로 풀어버렸다. 스테이지에 위치한 사람 숫자와 스테이지 & 스테이지 클리어한 사람 숫자와 스테이지 & 스테이지 실패율과 스테이지를 Map으로 3개 구현해놓고 로직을 짰다. 마지막에 실패율 정렬할 때는 Map에서 Comparator를 사용해서 SortByKey가 아닌 SortByValue를 만들어서 활용했다. 이렇게하면 Value 값에 따라 자동 정렬되어서 출력한다.
전체적인 로직은 단순하리만큼 간단하다. for문 돌면서 stage 세팅하고, 한번 더 돌면서 clearStage 세팅하고, 한번 더 돌면서 Result(실패율) 세팅한다. 그리고 Result를 SortByValue로 정렬시키고, iterator로 돌면서 출력하면 끝.
이번 코딩테스트에서 가장 더럽고 멍청하게 짠 코드인 것 같다. 반성하고 또 반성한다.