📕 문제 설명
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 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] |
📚 입출력 예 설명
입출력 예 #1
- 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.
입출력 예 #2
- 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
- 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.
😊 나의 답변
[1차 시도]
function solution(score) {
const average = score.map(([eng, math]) => (eng + math) / 2);
const sortedAverage = [...average].sort((a, b) => b - a);
let count = 1;
sortedAverage.forEach((v, i, self) => {
let idx = average.indexOf(v);
if(self[i - 1] === v) {
average[idx] = count;
} else {
average[idx] = i + 1;
count = i + 1;
}
});
return average;
}
테스트케이스는 반례까지 모두 통과했으나, 채점 시 실패하는 케이스가 있었다.
엄청 오래 매달려있었는데 계속 답이랑 멀어지는 것 같아 모두 지우고 다시 풀어보았다.
[2차 시도 - 정답]
function solution(score) {
const average = score.map(([eng, math]) => (eng + math) / 2);
const sortedAverage = [...average].sort((a, b) => b - a);
return average.map((v) => sortedAverage.indexOf(v) + 1);
}
indexOf는 값에 해당하는 첫번째 인덱스를 반환해주기 때문에 중복 등수도 쉽게 처리할 수 있었다.
정렬된 평균 점수 배열에서 index + 1을 해주면 등수가 나오기 때문!
오래 걸렸지만 많은 시도를 해본 문제... 🤦♀️
⭐ 다른 답변
function solution(score) {
return score.map((el) => {
return (
score.filter((v) => (v[0] + v[1]) / 2 > (el[0] + el[1]) / 2).length + 1
);
});
}
728x90
반응형
'프로그래머스 > Lv. 0 코딩테스트 입문' 카테고리의 다른 글
[프로그래머스] Lv.0 유한소수 판별하기 / JS (0) | 2023.08.21 |
---|---|
[프로그래머스] Lv.0 특이한 정렬 / JS (0) | 2023.08.18 |
[프로그래머스] Lv.0 로그인 성공? / JS (0) | 2023.08.18 |
[프로그래머스] Lv.0 치킨 쿠폰 / JS (0) | 2023.08.15 |
[프로그래머스] Lv.0 이진수 더하기 / JS (0) | 2023.08.14 |