728x90
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17681
📚 문제
🚫 제한사항
💡 아이디어
✅ 실패율 = (현재 X번 Stage를 도전하고 있는 사람 수) ÷ (X번 Stage를 도전했던, 도전 중인 사람 수)
다음과 같은 데이터가 예시로 주어졌다고 생각해 봅시다.
stages = [2, 1, 2, 6, 2, 4, 3, 3]
- 1번 Stage
- stages[1] = 1 → 1명이 현재 도전 중
- stages의 전체 요소 = 8명 → 1번 Stage를 도전 중이거나(1번 index), 이미 도전성공함(나머지 index)
- ∴ 실패율 = 1 / 8
- 2번 Stage
- stages[0] = stages[2] = stages[4] = 2 → 3명이 현재 도전 중
- stages의 전체 요소 - 1번 Stage 도전 중인 사람 수 = 7명
- ∴ 실패율 = 3 / 7
✅ HashMap 활용 : key(Stage), value(실패율)
이렇게 설정하면 value 값을 기준으로 정렬한 후, key값을 순서대로 출력하면 실패율이 높은 Stage부터 내림차순으로 정렬된 배열을 return하기 수월합니다.
✨ 잠깐, HashMap에서 value 기준으로 정렬은 어떻게 하는건지 궁금하신가요?
더보기
List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
- 가장 먼저, `map.keySet()`을 활용하여 해당 HashMap의 key 요소들을 담은 ArrayList를 하나 생성해줍니다.
- 해당 keySet을 lambda를 사용하여 위와 같이 정렬하면 value 값이 높은 요소부터 내림차순으로 정렬할 수 있습니다.
👩🏻💻 Java 풀이
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] cnt = new int[N];
for(int i = 0; i < stages.length; i++) {
if(stages[i] != N + 1) {
cnt[stages[i] - 1]++;
}
}
Map<Integer, Double> map = new HashMap<>();
int num = stages.length;
for(int i = 0; i < N; i++) {
if(cnt[i] == 0 || num == 0) {
map.put(i + 1, 0.0);
} else {
map.put(i + 1, (double)cnt[i] / num);
}
num -= cnt[i];
}
List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
int[] answer = new int[N];
for(int i = 0; i < N; i++) {
answer[i] = keySet.get(i);
}
return answer;
}
}
🎨 다른 풀이
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
HashMap<Integer, Integer> map1 = new HashMap<>();
HashMap<Integer, Double> map2 = new HashMap<>();
for(int i = 0; i < stages.length; i++) {
map1.put(stages[i], map1.getOrDefault(stages[i], 0) + 1);
}
double divide = stages.length;
for(int i = 1; i <= N; i++) {
if(map1.containsKey(i)) {
map2.put(i, (double)(map1.get(i)) / divide);
divide -= map1.get(i);
} else {
map2.put(i, 0.0);
}
}
List<Integer> keySet = new ArrayList<>(map2.keySet());
Collections.sort(keySet, (o1, o2) -> (map2.get(o2).compareTo(map2.get(o1))));
for(int i = 0; i < N; i++) {
answer[i] = keySet.get(i);
}
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
HashMap<Integer, Integer> map1 = new HashMap<>();
HashMap<Integer, Double> map2 = new HashMap<>();
for(int i = 0; i < stages.length; i++) {
map1.put(stages[i], map1.getOrDefault(stages[i], 0) + 1);
}
double divide = stages.length;
for(int i = 1; i <= N; i++) {
if(map1.containsKey(i)) {
map2.put(i, (double)(map1.get(i)) / divide);
divide -= map1.get(i);
} else {
map2.put(i, 0.0);
}
}
List<Integer> keySet = new ArrayList<>(map2.keySet());
Collections.sort(keySet, (o1, o2) -> (map2.get(o2).compareTo(map2.get(o1))));
for(int i = 0; i < N; i++) {
answer[i] = keySet.get(i);
}
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
int user = stages.length;
double[] failRate = new double[N];
HashMap<Integer, Integer> fail = new HashMap<>();
for (int i = 1; i <= N; i++) {
fail.put(i, count(stages, i));
}
int idx = 0;
for (Integer key : fail.keySet()) {
failRate[idx++] = (double) fail.get(key) / user;
if (user == fail.get(key))
user = 1;
else
user -= fail.get(key);
}
Double[] temp = new Double[N];
for (int i = 0; i < N; i++) {
temp[i] = failRate[i];
}
Arrays.sort(temp, Collections.reverseOrder());
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (failRate[i] == temp[j]) {
if (answer[j] != 0)
continue;
answer[j] = i+1;
break;
}
}
}
return answer;
}
public int count(int[] arr, int n) {
int cnt = 0;
for (int i : arr) {
if (i == n)
cnt++;
}
return cnt;
}
}
🔗 참고 링크
※ 끝까지 봐주셔서 감사합니다. 오류에 대한 지적은 언제나 환영입니다😊
728x90