<문제 설명>
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
<제한 사항>
0 ≤ score[0], score[1] ≤ 100
1 ≤ score의 길이 ≤ 10
score의 원소 길이는 2입니다.
score는 중복된 원소를 갖지 않습니다.
<입출력 예>
score | result |
[[80, 70], [90, 50], [40, 70], [50, 80]] | [1, 2, 4, 3] |
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] | [4, 4, 6, 2, 2, 1, 7] |
<문제 풀이>
function solution(score) {
let result = []
let answer = []
for(let i = 0; i < score.length; i++){
result.push((score[i][0]+score[i][1])/2)
}
let sorted = result.slice().sort((a,b)=>b-a)
for(let j = 0; j < result.length; j++){
let rank = sorted.indexOf(result[j])+1
answer.push(rank)
}
return answer
}
각 배열의 요소는 숫자 두개씩 담겨있기 때문에,
반복문을 돌려서 result에 두 숫자의 평균값으로 먼저 반환했다.
sorted에 원본이 바뀌지 않도록 먼저 slice를 하고, sort b-a로 내림차순으로 배열을 정리했다.
순서를 정하는 rank라는 변수를 선언하고, indexOf는 괄호 안의 값의 인덱스값을 반환한다.
내림차순 하기 전 평균값을 구한 result 원본의 값을 반복문으로 각각 찾아서
해당 값이 sorted에 있을 경우 인덱스 값을 반환하는데,
인덱스는 0부터 시작하는데 순서는 1부터 시작하므로 1을 더해준다.
그리고 rank라는 변수를 answer라는 빈 배열에 담아서
answer에는 sorted의 순서가 담긴다.
<개선된 다른 풀이>
function solution(score) {
let avg = score.map(v=>(v[0]+v[1])/2);
let sorted = avg.slice().sort((a,b)=>b-a);
return avg.map(v=>sorted.indexOf(v)+1);
}
내가 하려는 방식이 그대로 담겨 있는데, 굳이 반복문으로 1차원적으로 풀기보다
map으로 기존 배열에서 새로운 규칙을 넣은 배열로 반환할 수 있었다.
<코멘트>
map이 생각은 났는데 어떻게 써나가야할지 몰라서 난 아직 멀었구나 생각하며
반복문 돌렸는데, 다음번에 문제를 풀 때 map이 생각나면 시도해봐야겠다.
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 문자열 내림차순으로 배치하기 (0) | 2023.04.19 |
---|---|
[프로그래머스 | JavaScript] 옹알이 (1) (0) | 2023.04.16 |
[프로그래머스 | JavaScript] 겹치는 선분의 길이 (0) | 2023.04.14 |
[프로그래머스 | JavaScript] 평행 (0) | 2023.04.13 |
[프로그래머스 | JavaScript] 저주의 숫자 3 (0) | 2023.04.12 |