https://programmers.co.kr/learn/courses/30/lessons/83201
function solution(scores) {
var answer = [];
let n = scores.length;
for (let i = 0; i < n; i++) {
let temp = [];
let average = 0;
for (let j = 0; j < n; j++) {
temp.push(scores[j][i]);
}
// console.log(temp);
let max = Math.max(...temp);
let min = Math.min(...temp);
let chk = checkUniq(max, min, temp);
switch (chk) {
case 'maxmin':
let flag = false;
// console.log(`max: ${max}, min: ${min}`);
if (!flag && temp[i] == max) {
temp.splice(temp.indexOf(max), 1);
flag = true;
}
if (!flag && temp[i] == min) {
temp.splice(temp.indexOf(min), 1);
flag = true;
}
break;
case 'max':
temp[i] == max ? temp.splice(temp.indexOf(max), 1) : temp = temp;
break;
case 'min':
temp[i] == min ? temp.splice(temp.indexOf(min), 1) : temp = temp;
break;
}
console.log(temp);
average = calc(temp);
let rank = chk_rank(average);
answer.push(rank);
}
return answer.join('');
}
function calc(temp) {
let average = 0;
temp.forEach(el => {
average += el;
})
average /= temp.length;
return average;
}
function chk_rank(average) {
// console.log(`average : ${average}`)
if (average >= 90) return 'A';
else if (average >= 80) return 'B';
else if (average >= 70) return 'C';
else if (average >= 50) return 'D';
else return 'F';
}
function checkUniq(max, min, temp) {
console.log(max, min, temp)
let mxchk = 0;
let mnchk = 0;
temp.forEach(el => {
if (el == max) mxchk++;
if (el == min) mnchk++;
})
if (mxchk == 1 && mnchk == 1) return "maxmin";
else if (mxchk == 1 && mnchk != 1) return "max";
else if (mxchk != 1 && mnchk == 1) return "min";
else return 'notunique'
}
// let scores = [[100, 90, 98, 88, 65], [50, 45, 99, 85, 77], [47, 88, 95, 80, 67], [61, 57, 100, 80, 65], [24, 90, 94, 75, 65]]
// let scores = [[50, 90], [50, 87]];
// let scores = [[70, 49, 90], [68, 50, 38], [73, 31, 100]];
let scores = [[75, 50, 100], [75, 100, 20], [100, 100, 20]];
console.log(solution(scores));
문제이해와 checkUniq에서 생각보다 해맷던 문제다.
평균값을 계산하는게 세로 점수기 때문에 먼저 temp에 세로 점수를 temp에 넣어서 값을 구한다.
그리고 그 안에서 최대값과 최소값을 구해서 먼저 유일값인지 체크한다.
처음에는 max랑 min을 하나의 flag로 해서 할려고했는데 틀렸다고 뜨고, 왜 틀렸지 생각하다보니 이거를 따로 둬야겠다고 생각했다. 자기 점수가 max인지 min인지 알아야 하기 때문이다.
유일한 것들을 return해서 상태에 따라 다르게 처리를 했다.
maxmin이면 둘 다 유일값으로 max거나 min인 경우 해당 값을 temp에서 삭제.
flag를 둔 이유는 최대 최소가 같은값 이면 두번 지우게되서 flag를 두었다.
배열이 다 정리가 되면 average와 rank를 구해서 출력한다.