진료순서 정하기
https://school.programmers.co.kr/learn/courses/30/lessons/120835
나의 풀이
function solution(emergency) {
let order = emergency.sort((a,b) => b-a).map((_, i) => i)
return order;
}
- 순서를 내림차순으로 정렬한 뒤에 인덱스 배열은 찾았지만 이 인덱스와 해당 요소를 어떻게 연결해야할지 몰라서 풀지 못함.
다른 사람의 풀이
function solution(emergency) {
let order = emergency.slice().sort((a,b) => b-a)
return emergency.map(e => order.indexOf(e) + 1);
}
- 내가 의도했던 풀이와 같은 코드가 있었다.
코드에 대한 해석은 다음과 같다.
- emergency.slice()를 사용하여 emergency 배열을 복사한다. slice()를 사용하여 새로운 배열을 생성하는 이유는 원래 배열을 변경하지 않고 정렬된 배열을 사용하기 위해서다.
- sort((a, b) => b - a)를 사용하여 order 배열을 내림차순으로 정렬한다. 이를 통해 응급 상황의 우선 순위가 높은 순서대로 정렬된다.
- emergency.map(e => order.indexOf(e) + 1)을 사용하여 emergency 배열의 각 요소에 대해 정렬된 order 배열에서의 인덱스를 찾고, 1을 더하여 우선 순위 순서를 나타내는 배열을 생성한다.
- order.indexOf(e)는 e의 값이 order 배열에서 처음으로 등장하는 인덱스를 찾는다.
- + 1은 인덱스를 1부터 시작하는 우선 순위로 변환하기 위해 값을 증가시킨다.
예를 들어, solution([3, 1, 4, 2])를 호출하면 [2, 4, 1, 3]이 반환된다. emergency 배열의 요소들은 [3, 1, 4, 2]이며, 정렬된 order 배열은 [4, 3, 2, 1] 다.
따라서 3은 order 배열에서 2번째, 1은 order 배열에서 4번째, 4는 order 배열에서 1번째, 2는 order 배열에서 3번째에 위치하므로, 반환되는 배열은 [2, 4, 1, 3]이 된다.
가까운 수
https://school.programmers.co.kr/learn/courses/30/lessons/120890
나의 풀이
function solution(array, n) {
let gaps = []
array = array.sort()
for(let e of array){
let d = n - e
gaps.push(d)
}
// gaps의 음수 양수 값이 모두 같도록 하고,
gaps = gaps.map(e => e < 0 ? -e : e)
// 가장 작은 수를 찾아,
let min = Math.min(...gaps)
// gaps의 가장 작은 수의 인덱스와 같은 array[i] 리턴. (이때 array는 작은 수부터 큰 수대로 sort로 정렬이 되어 있기 때문에 indexOf로 찾은 min은 같은 gap이라도 더 작은 수의 gap이다.)
return array[gaps.indexOf(min)];
}
코드 리팩토링
function solution(array, n) {
let gaps = array.sort().map(e => n - e).map(e => e < 0 ? -e : e)
let min = Math.min(...gaps)
return array[gaps.indexOf(min)];
}
- 처음 풀이했던 코드를 한줄로 리팩토링했다.
다른 사람의 풀이
function solution(array, n) {
array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}
- 다른 사람의 풀이를 보니 Math.abs로 풀이한 경우가 많아서 이에 대해 공부하려고 함.
- Math.abs란? Math.abs() 함수는 주어진 숫자의 절대값을 반환한다. x가 양수이거나 0이라면 x를 리턴하고, x가 음수라면 x의 반대값, 즉 양수를 반환한다. (즉, 나의 풀이에서는 e가 음수이면 -e를 해준 코드를 간단하게 작업 가능한 메소드이다.)
- 게다가 sort의 매개변수 a,b를 사용하여 절댓값의 차이가 작은 순서대로 정렬하거나 두 숫자의 차이가 같다(두 숫자의 차이가 0이)면, a - b로, 즉 오름차순으로 정렬하도록 하였다.
- || 은 논리 연산자 중 or 연산자로 앞의 값이 거짓(0)이면 뒤의 값을 대신 반환한다. 자바스크립트에서는 거짓을 항상 0으로도, 참은 1로도 전제함을 잊지 말아야한다.
'JS > 알고리즘(코테)' 카테고리의 다른 글
프로그래머스 코딩테스트 LV.0 조건 문자열, 코드 처리하기 (0) | 2023.05.31 |
---|---|
프로그래머스 LV.1 - 문자열 내 마음대로 정렬하기 (0) | 2023.05.26 |
프로그래머스 LV.0 - 수 조작하기 2 (0) | 2023.05.23 |
프로그래머스 LV.0 - 배열 만들기2 (0) | 2023.05.23 |
최대공약수와 최소공배수(유클리드 호제법) (0) | 2023.05.20 |