TIL 016 | 상호 평가 - 프로그래머스 문제풀이

김태규·2021년 8월 9일
1
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/83201

1차 풀이

function solution(scores) {
    let answer = '';
    let length = scores.length
    for(let i = 0; i < length; i++){
        let arr = [];
        let max = 0;
        let min = 100;
        for(let j = 0; j < length; j++){
            arr.push(scores[j][i]);   // 이렇게 해야 arr에 '한 열'의 점수가 모인다.
            if(scores[j][i] > max) max = scores[j][i];
            if(scores[j][i] < min) min = scores[j][i];
        }
        if(scores[i][i] === max || scores[i][i] === min) arr.splice(i, 1);
        
        let mean = arr.reduce((a, b) => a + b, 0) / arr.length; // 배열의 누적합/배열의 길이 = 평균
        
        if(mean >= 90) answer+="A";
        else if(mean >= 80 && mean < 90) answer+="B";
        else if(mean >= 70 && mean < 80) answer+="C";
        else if(mean >= 60 && mean < 70) answer+="D";
        else answer+="F";
    }
    return answer;
}

테스트 21개중에 5개는 통과하지 못 했는데, 이유를 곰곰히 생각해보니 문제 조건 중에서 점수를 제외하는 경우는 점수가 유일한 최고점 또는 유일한 최저점일 때라고 했는데 그 부분을 고려하지 못 했다.


2차 풀이

function solution(scores) {
    let answer = '';
    let length = scores.length
    for(let i = 0; i < length; i++){
        let arr = [];
        let max = 0;
        let min = 100;
        for(let j = 0; j < length; j++){
            arr.push(scores[j][i]);
            if(scores[j][i] > max) max = scores[j][i];
            if(scores[j][i] < min) min = scores[j][i];
        }
        let countMax = arr.filter(element => max === element).length;
        let countMin = arr.filter(element => min === element).length;
        
        if(scores[i][i] === max && countMax === 1) arr.splice(i, 1);
        else if(scores[i][i] === min && countMin === 1) arr.splice(i, 1);
        
        let mean = arr.reduce((a, b) => a + b, 0) / arr.length;
        
        if(mean >= 90) answer+="A";
        else if(mean >= 80 && mean < 90) answer+="B";
        else if(mean >= 70 && mean < 80) answer+="C";
        else if(mean >= 50 && mean < 70) answer+="D";
        else answer+="F";
    }
    return answer;
}

유일한 최고점 또는 유일한 최저점일 경우를 어떻게 표현해야할지 혼자서 고민도 해보고 구글링도 해본 결과, filter와 length를 결합해서 arr의 최대값의 개수와 최소값의 개수를 변수 countMax와 countMin에 할당해서 문제를 해결했다.

0개의 댓글