코딩테스트 진료순서 정하기
문제 설명
출력 예시
emergency 배열에 큰 숫자부터 순위를 1부터 주는 문제 입니다.
[5, 25, 15, 30] 란 배열이 있으면 정답 출력은 [4, 2, 3, 1] 로 해야 합니다.
바로 문제 풀이 들어가시죠.
const emergency = [3, 76, 24];
let emergencySort = emergency.sort((a,b) => {b - a});
제가 생각한 방법은 emergency 배열 요소의 큰값부터 1순위를 주기위해,
emergency 배열을 내림차순으로 새로운 변수를 만들어 큰값요소부터 indexOf 메서드를 이용하여 그 인덱스 자리에
1부터 시작하는 등수를 매겨 주는겁니다!
하지만 이번문제에서 sort에게 문제가 있었습니다..
이 sort는 (a,b) => {b - a} 배열을 내림차순으로 만드는 방법입니다.
반대로 오름차순으로 만들고 싶으면 리턴값쪽을 {a - b} 로 만들어 주면 됩니다.
문제는 저대로 사용하면 원본 배열인 emergency에도 영향이 갑니다.
const emergency = [3, 76, 24];
let emergencySort = emergency.sort((a,b) => {b - a});
//emergencySort = [76, 24, 3]
//emergency = [76, 24, 3]
emergencySort는 [76, 24, 3] 제가 원하던대로 내림차순으로 배열이 만들어졌지만
emergency도 sort영향에 미쳐 [76, 24, 3] 로 내림차순 배열로 변하고 맙니다.
그래서 찾은 방법은 배열펼침연산 을 이용 하는 겁니다.
배열펼침연산은 새로운 배열을 출력 하기 때문에 원본에 영향이 안갑니다.
const emergency = [3, 76, 24];
let emergencySort = [...emergency].sort((a,b) => {return b - a});
//emergencySort = [76, 24, 3]
//emergency = [3, 76, 24]
이렇게 하면 원본 배열에 영향없이 새로운 배열이 만들어졌습니다!
그대로 쭉쭉 풀이를 가자면,
const emergency = [3, 76, 24];
let emergencySort = [...emergency].sort((a,b) => {return b - a}); //emergency배열을 내림차순으로
emergencySort.forEach((e,i) => {
answer[emergency.indexOf(e)] = i+1; //76,24,3 순서대로 emergency 배열에서
}); //같은 요소의 인덱스를 찾아서그 자리에 i+1(순위) 값 넣기
//answer = [3, 1, 2]
indexOf 이럴때 쓰라고 있는거였습니다..!
forEach에서 처음 순서인 76은 emergency배열의 1번 인덱스입니다. 그러면
answer[1] = i(0) + 1
이 되어 answer에는 [, 1, ] 이렇게 저장이 되고 forEach를 끝까지 돌리면 다 채워지게 될겁니다!