[JavaScript][Programmers] 상호평가

조준형·2021년 8월 10일
0

Algorithm

목록 보기
61/142
post-thumbnail

🔎 상호 평가

❓ 문제링크

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를 구해서 출력한다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글