문제
더보기
제한사항
입출력 예scoreresult
입출력 예 설명
문제 설명
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ score[0], score[1] ≤ 100
- 1 ≤ score의 길이 ≤ 10
- score의 원소 길이는 2입니다.
- score는 중복된 원소를 갖지 않습니다.
입출력 예scoreresult
[[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. 평균 점수 내서 배열에 추가하기 (이때, 원래 순서를 기억하기 위해서 고유한 숫자(id)를 부여해주기)
- 그냥 평균 계산해주면 된다.
- 원래 순서 기억하려고 0부터 순서대로 숫자를 넣어주었다.
- ex) [원래 순서, 평균 점수]
let avg_list = []; //원래 순서, 평균 점수
for(let i=0; i<score.length; i++){
let avg = (score[i][0] + score[i][1])/2;
avg_list.push([i, avg]);
}
2. 평균 점수대로 정렬하기
- 다차원 배열 정렬하는 법이 유용하다
- sort function에 배열 인덱스만 따로 써주면 된다.
- ex) [원래 순서, 평균 점수] 배열에서 평균점수로 정렬을 해주고 싶다면, 배열명.sort((a,b) => { return b[1] - a[1] });
avg_list = avg_list.sort(function(a,b){
return b[1] - a[1];
});
3. 등수 내기
- 여기가 조금 까다로웠다. 공동 등수를 매겨줘야 했기 때문이다.
- filter 함수를 사용하여 해당 점수를 가진 사람이 몇명 있는지를 세서 배열에 넣어주었다.
- 첫번째 사람은 무조건 1등이므로, 반복문을 돌리기 전에 1등은 먼저 넣어주었다.
- 2번째 사람부터 반복문을 돌렸다. 현재 사람과 이전 사람의 점수를 비교하는 방식으로 진행했다.
- 이전 사람과 점수가 같다면, 그 사람 등수와 같은 등수를 부여했다.
- 이전 사람과 점수가 같지 않다면, 그 사람의 등수는 이전 사람의 등수 + 이전 사람과 같은 점수를 가진 사람의 수 로 부여해주었다.
- ex) 이전 사람 등수가 2등이고, 그 점수를 가진 사람이 2명이라면, 3등은 없이 4등부터 시작되기 때문에 현재 사람의 등수는 이전 사람 등수 (2) + 그 점수를 가진 사람의 수(2)로 4등이 부여된다.
let num_list = [];
// 같은 점수 명수 세기
avg_list.map((e)=>{
let temp = e[1];
num_list.push([e[0], e[1], avg_list.filter(e => e[1] === temp).length]);
})
let temp = 1;
num_list[0].push(1);
for(let i=1; i<num_list.length; i++){
// 이전 사람과 점수가 같지 않다면,
// 등수 = 이전 사람 등수 + 이전 사람과 같은 점수를 가진 사람 수
if(num_list[i-1][1] !== num_list[i][1]){
temp = temp + num_list[i-1][2];
num_list[i].push(temp);
}
// 이전 사람과 점수가 같다면, 이전 사람과 같은 등수 넣어주기
else if(num_list[i-1][1] === num_list[i][1]) {
num_list[i].push(temp);
}
}
4. 원래 순서대로 (1번에서 부여한 id 참고) 정렬한 후, 정답 배열에는 등수만 넣어주기
num_list.sort((a,b)=>{
return a[0]-b[0];
})
num_list.map((e)=>{
answer.push(e[3]);
})
공동 등수 때문에 조금 애먹었던 문제였다 ... ^_^
아래는 전체 코드
더보기
function solution(score) {
let answer = [];
let avg_list = []; //원래 순서, 평균 점수
for(let i=0; i<score.length; i++){
let avg = (score[i][0] + score[i][1])/2;
avg_list.push([i, avg]);
}
// 정렬해서 등수 매기기
avg_list = avg_list.sort(function(a,b){
return b[1] - a[1];
});
let num_list = [];
avg_list.map((e)=>{
let temp = e[1];
num_list.push([e[0], e[1], avg_list.filter(e => e[1] === temp).length]);
})
let temp = 1;
num_list[0].push(1);
for(let i=1; i<num_list.length; i++){
if(num_list[i-1][1] !== num_list[i][1]){
temp = temp + num_list[i-1][2];
num_list[i].push(temp);
} else if(num_list[i-1][1] === num_list[i][1]) {
num_list[i].push(temp);
}
}
// 원래 순서대로 정렬
num_list.sort((a,b)=>{
return a[0]-b[0];
})
num_list.map((e)=>{
answer.push(e[3]);
})
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스 JS] 연속된 수의 합 (0) | 2022.12.13 |
---|---|
[프로그래머스 JS] 치킨 쿠폰 (0) | 2022.12.13 |
[프로그래머스 JS] 안전지대 (0) | 2022.12.11 |
[프로그래머스 JS] 저주의 숫자 3 (0) | 2022.12.11 |
[프로그래머스 JS] 다항식 더하기 (0) | 2022.12.09 |