본문 바로가기
코딩 테스트 연습/프로그래머스 level 0

[프로그래머스] lv0. 진료순서 정하기 (JS)

by 카누가 좋아요 2023. 6. 25.

❓ 문제

코딩테스트 연습 - 진료순서 정하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

🤨 나의 코드

'정렬' 이 핵심인 문제이다.

 

// 정렬 기준 (응급도 내림차순)
function criteria(a, b) {
  return b[0] - a[0];
}

function solution(emergency) {
  answer = [];     
  for (let i = 0; i < emergency.length; i++) {
    answer.push(0);     // 정답 배열 일단 emergency 배열의 길이만큼의 0으로 초기화
  }
  for (let i in emergency) {     // i는 emergency 요소 하나하나의 인덱스
    emergency[i] = [emergency[i], Number(i)];     // emergency 요소 하나하나를 [응급도, 응급도 인덱스] 로 변경 (emergency는 이차원 리스트가 됨.)
  }
  emergency.sort(criteria);
  for (let i in emergency) {     // i는 emergency 요소 하나하나의 인덱스
    answer[emergency[i][1]] = Number(i) + 1;     // 현재 요소의 응급도 인덱스에 해당하는 answer의 인덱스의 값을 현재 순위로 변경
  }
  return answer;
}

 

📍 알 수 있었던 점

➡️ JS에서 이차원 리스트를 0번째 요소 기준으로 내림차순 정렬하려면 b[0] - a[0]의 값을 반환해 주어야 한다.

➡️ let i in emergency로 작성하면 i에는 emergency의 인덱스가 0부터 하나씩 증가하면서 할당되게 되는데, 그 type이 string이다.

 

처음에 emergency 배열의 값들을 새로운 배열에 똑같이 넣어 정렬 후 그 배열에서의 응급도의 인덱스에 따라 순위를 결정하려 했는데 js 활용능력 부족으로 구현하지 못하고 좀 복잡하게 코드를 작성하였다.

아래는 다른 사람의 코드에 대하여 설명하는데, 내 원래 의도와 같은 방식이다.

 

 

💡 해결하기

1️⃣ emergency 배열에 들어 있는 값들을 '전개 연산자'를 이용하여 새로운 배열에 넣는다.

여기에서 전개 연산자를 사용하게 되면 깊은 복사가 이루어져 새로운 배열의 값을 변형한다 하더라도 emergency 배열에 영향을 미치지 못한다.

 

* 전개 연산자는 1단계까지의 깊은 복사가 가능! 예를 들어 객체 속의 객체의 경우 2단계에 해당하는데, 이는 참조 값을 전달하는 (같은 주소를 사용하는) 얕은 복사로 이루어짐.

JS - 깊은복사와 얕은복사 그리고 spread operator에 대해서 (velog.io)

 

JS - 깊은복사와 얕은복사 그리고 spread operator에 대해서

js의 깊은복사와 얕은복사 파헤치기 ❤️‍🔥

velog.io

 

2️⃣ 새로운 배열을 내림차순으로 정렬한다.

내림차순 정렬은 오름차순 정렬 때와 반대로 b - a 값을 반환한다.

(a, b가 차례로 인자로 들어갈 때)

 

3️⃣ emergency 배열의 요소들을 하나씩 돌면서 sort에서 해당 원소의 인덱스를 찾고, 그에 1을 더한 값으로 변경한다.

array.findIndex(function) 메서드를 사용하면 리스트에서 원하는 원소의 인덱스를 찾아낼 수 있다.

(위 메서드는 function을 만족하는 원소가 없다면 -1을 반환한다.)

 

 

 

💻 JS로 코드 작성하기

 

function solution(emergency) {
  let sort = [...emergency].sort((a, b) => b - a);     // emergency와 똑같은 값을 가지는 sort 배열 생성, 내림차순 정렬
  return emergency.map(k => {
      const queue = sort.findIndex(v => v === k);     // 현재 보고 있는 emergency의 요소가 sort에서의 값과 일치할 경우 그 인덱스 + 1로 emergency의 요소 변경

      return queue + 1
  });
}

댓글