외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
기존 배열인 emergency의 순서는 유지하되 각 원소에 해당하는 진료 순서를 별도로 부여해 주어야 하는 문제였다. 그래서 value에 key라는 구별자를 별도로 줄 수 있는 HashMap을 사용했다.
우선 기존 emergency 배열의 순서는 유지해야 하기 때문에 Arrays.copyOf()로 원본 배열을 복사한 다음, 복사한 배열을 Arrays.sort()로 오름차순 정렬해 주었다.
(* 내림차순이 가능한 Collections.reverseOrder()는 Wrapper만 가능)
진료 순서가 될 변수 int rank = 1;을 선언 및 초기화하고, HashMap 객체를 생성해 준 뒤에는 for문으로 루프를 도는데, 이때 응급 순서가 높다 = 원소 값이 크다이므로 내림차순으로 값을 순회할 수 있도록 초기식을 int i = temp.length - 1;로 하여 값이 1씩 감소될 수 있도록 해준다.
그리고 for문에서는 put()으로 값을 저장해 주는데, 이때 key가 원소값이 되고, value가 진료 순서가 된다. 그 이유는 궁극적으로 구해야 하는 값이 진료 순서이며, emergency 원소를 key로 활용해 map에서 값을 꺼낼 것이기 때문이다.
💡
배열에 익숙해진 탓에 언뜻 생각하면 key가 index처럼 순차적으로 증가해야 하는 거 아닌가 해서 진료 순서를 key로 잡을 수도 있는데(내 얘기)map의 key는 식별자이고 중복되지만 않으면 된다는 점을 꼭 기억하자!
(*제한사항에 따라 emergency의 원소는 중복되지 않았다)
map에 값을 모두 저장했다면, 앞서 말한 것처럼 get()으로 루프를 돌며 emergency[i]를 key로 갖는 value 값을 answer[i]에 넣어 주면 된다.
import java.util.Arrays;
import java.util.HashMap;
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
int[] temp = Arrays.copyOf(emergency, emergency.length);
Arrays.sort(temp);
int rank = 1;
HashMap<Integer, Integer> rankMap = new HashMap<>();
for(int i = temp.length - 1; i >= 0; i--){
rankMap.put(temp[i], rank++);
}
for(int i = 0; i < emergency.length; i++) {
answer[i] = rankMap.get(emergency[i]);
}
return answer;
}
}
