[js] 진료 순서 정하기 (lv.0, 정답률 85%)

sookyoung.k·2024년 5월 8일
0
post-thumbnail

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

제한사항

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

나의 풀이

function solution(emergency) {
    let answer = Array(emergency.length).fill(0);
    for (let i=1; i<=emergency.length; i++) {
        let bigger = Math.max(...emergency);
        let idx = emergency.indexOf(bigger);
        answer[idx] = i;
        emergency[idx] = 0;
    }
    return answer;
}

원본 배열에 손을 대고 싶지 않았지만... 지금은 이런 방법밖에 떠오르지 않았다.

  • 먼저 emergency와 똑같은 크기의 배열을 만들어 원소를 전부 0으로 초기화를 해준다.
  • 그리고 i가 emergency.length가 될 때까지 for문을 돈다.
  • emergency 배열에서 가장 큰 값의 idx(인덱스)를 찾는다.
  • 그러면 answer 배열에서도 같은 idx(인덱스)값을 i로 변경하고, 중복이 되지 않도록 emergency의 idx를 0으로 값을 바꿔준다.

짜잔 그러면 답이 나오긴 한답니다.

다른 풀이 1

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

indexOf를 쓸거면 굳이 나처럼 복잡하게 배열 만들고 할 필요가 없었잖아?!

  • slice()를 사용하여 원본 배열의 복사본을 만든다. 그리고 sort()를 사용해서 내림차순으로 정렬한다. 그러면 가장 큰 값이 배열의 첫 번째 요소에 오게 된다.
  • map()을 사용하여 원본 배열의 각 요소 v에 대해서 함수를 실행한다.
  • sorted.indexOf(v)를 사용하여 정렬된 배열 sorted에서 v의 인덱스를 찾는다. 배열은 0부터 인덱싱 되기 때문에 실제 값을 얻기 위해서는 +1을 해준다.
    이를 통해서 v가 몇 번째로 큰 값인지 알 수 있으면서 새로운 배열을 효율적으로 반환할 수 있다.

내가 원래 추구하던 방향이 이거였는데... 너무 복잡하게 생각하지 말고 여러 함수들과 좀 친해져보자!

다른 풀이 2

function solution(emergency) {
    let sort = [...emergency].sort((a, b) => b - a);
    return emergency.map(k => {
        const queue = sort.findIndex(v => v === k);

        return queue + 1
    });
}

여기도 비슷함! 하지만 indexOf()가 아닌 findIndex()를 사용했다.

  • 내림차순으로 정렬한 sort 배열을 새로 만들어준다.
  • 원본 배열을 map()을 사용하여 각 요소 k에 대하여 연산을 수행한다.
  • 정렬된 배열 sort에서 현재 요소 k의 인덱스를 찾기 위해 findIndex(v => v===k)를 사용한다. 이를 통해 요소 k가 크기 순서에 따라 몇 번째 위치하는지 나타내준다.
  • 그리고 배열의 인덱스는 0부터 시작하기 때문에 실제 순위를 얻기 위해서는 1을 더해준다.
profile
영차영차 😎

0개의 댓글

Powered by GraphCDN, the GraphQL CDN