Day 8 배열, 구현, 수학
Day8 8단계 20231025
3. 진료순서 정하기
import java.util.*;
class Solution {
public int[] solution(int[] emer) {
List<Integer> list = new ArrayList<>();
int[] answer = new int[emer.length];
for (int i : emer) {
list.add(i);
}
list.sort(Comparator.reverseOrder());
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < emer.length; j++) {
if (list.get(i) == emer[j]) {
answer[j] = i+1;
}
}
}
return answer;
}
}
- 이중 for문을 쓰게 되면 HashMap을 쓰는 걸 고려해보자
- 내 풀이 : 이중 for문, 배열 3개 사용
List<Integer> list = new ArrayList<>();
int[] answer = new int[emer.length];
for (int i : emer) {
list.add(i);
}
list.sort(Comparator.reverseOrder());
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < emer.length; j++) {
if (list.get(i) == emer[j]) {
answer[j] = i+1;
}
}
}
- 다른 사람 풀이 : Map을 사용한 풀이
- Map에 emergency 배열의 키(요소)와 값(인덱스)를 넣고, emergency를 오름차순 정렬하면 가장 큰 수가 맨 뒤로 간다.
- 정렬된 emergency의 인덱스가 각 요소의 응급 순서이다.
- answer 배열에 넣을 때 원래 emergency 배열의 인덱스에 있던 요소 대신 응급 순서를 넣어야 하므로, Map에서 키(요소)가 가진 값(인덱스) 가 answer 배열의 인덱스가 된다.
- answer 배열의 인덱스에서 키(요소)의 응급 순서(정렬된 emergency에서의 인덱스)는 정렬된 emergency에서 오른쪽으로 갈 수록 숫자가 낮아지므로(우선순위란 뜻), 정렬된 emergency의 길이로부터 차이 나는 값을 이용한다.
- i를 emergency의 길이에서 1을 뺀 값(배열의 특성)은 전체 길이에서 1 차이가 나므로 우선 순위가 1임을 표시할 수 있다. 이로부터 감소하는 순서대로 배열에 넣으면 완성
Map<Integer. Integer> map = new HashMap<>();
int[] answer = new int[emergency.length];
for(int i = 0; i < emergency.length; i++) {
map.put(emergency[i], i);
}
Arrays.sort(emergency);
for(int i = emergency.length-1; i >= 0; i-) {
answer[map.get(emergency[i])] = emergency.length - i;
}