자료구조 및 알고리즘/JavaScript Practice

JS Practice) 프로그래머스 : 진료 순서 정하기

Ryomi 2023. 3. 17. 09:38
728x90
반응형

 

 

진료 순서 정하기

문제설명

: 외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

제한 사항

  • 중복된 원소는 없습니다.
  • 1 ≤ emergency의 길이 ≤ 10
  • 1 ≤ emergency의 원소 ≤ 100

 

입출력 예

emergency result
[3, 76, 24] [3,1,2]
[1,2,3,4,5,6,7] [7,6,5,4,3,2,1]

 

첫번째 접근

: sort()는 mutable 하므로 emergency 배열을 복사해 내림차순으로 정렬한 order 배열을 만든다.

그리고 order와 emergency, 두 배열을 돌며 요소가 동일한 경우에 새로운 배열 answer에 order의 index에 1을 더한 값을 넣어 진료 순서를 매긴다. 

function solution(emergency) {
    let answer = new Array(emergency.length);
    let order = emergency.slice().sort((a,b) => b - a);
    
    for(let i = 0; i < emergency.length; i++) {
        for(let j = 0; j < order.length; j++) {
            if(emergency[i] === order[j]){
                answer[i] = j + 1
            }
        }
    }
    return answer
}

 

 

두번째 접근

: 이중 for문을 돌리니, 뭔가 복잡한것 같다. 좀 더 간결해질 수 있는 방법은 없을까?

먼저, 굳이 answer의 길이를 정해줄 이유는 없다고 생각해 answer에 새로운 배열을 할당했다.

그리고 answer에 들어가야 할 값은 order 배열의 요소를 순서대로 받아 emergency 배열에서의 index를 찾은 후 answer 배열에 1씩 증가한 값을 넣어 순서를 매겨 해결할 수 있다고 생각했다. 

function solution(emergency) {
    let answer = []
    let order = emergency.slice().sort((a, b) => b - a);
    let i = 1
    order.map(el => answer[emergency.indexOf(el)] = i++ )
    return answer;   
}

 

 

solution

function solution(emergency) {
    let sorted = emergency.slice().sort((a,b)=>b-a);
    return emergency.map(v=>sorted.indexOf(v)+1);
}

// 아... 내림차순으로 정렬한 배열(sorted)에서 기존 배열(emergency)의 요소의 인덱스를 가져와 해당 인덱스에 1을 더한 값을 emergency의 요소 대신 넣어준 새로운 배열 반환

728x90
반응형