N

(프로그래머스 JS)위클리 챌린지 2주차 본문

프로그래머스 알고리즘/Weekly Challenge

(프로그래머스 JS)위클리 챌린지 2주차

naeunchan 2021. 8. 19. 11:09
728x90
반응형

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

 

코딩테스트 연습 - 2주차

[[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]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

 

 

문제를 풀다가 행과 열을 반대로 생각해서 깜짝 놀랐다...ㅎㅎ

이 점만 주의하면 문제는 쉽게 풀 수 있다.

 

이중 for문을 이용한 문제 풀이.

 

현재 학생의 인덱스가 i라면 자신의 점수는 scores[i][i]다.

min = 현재 학생이 받은 점수 중 최저점.

max = 현재 학생이 받은 점수 중 최고점.

count = 자신을 채점한 점수와 다른 학생이 준 점수가 같은지 카운팅.

sum = 현재 학생이 받은 점수의 총 합.

numOfStudent = 평균을 낼 때 학생의 수.

 

배열을 [i][j]가 아닌 [j][i]로 순회해야 한다.

순회하면서 min과 max를 갱신해주면서, 방문한 값이 자신이 준 점수와 같은지 확인하면서, 총 점수까지 구하면서 진행했다.

 

중첩 for문이 끝나면 평균을 구해야 한다.

평균을 구하기 전, count === 1인지 확인한다.

만약 1이라면 자신이 준 점수가 유일하다는 뜻이기 때문이다.

또한, 자신이 준 점수가 최고점인지(max), 최저점인지(min) 확인하여 numOfStudent를 갱신한다.(참이라면 numOfStudent--)

 

이후 평균을 내어 grade 함수로 학점을 구하면 된다.

function grade(score){
    if(score >= 90){
        return "A";
    }
    else if(score >= 80 && score < 90){
        return "B";
    }
    else if(score >= 70 && score < 80){
        return "C";
    }
    else if(score >= 50 && score < 70){
        return "D";
    }
    else{
        return "F";
    }
}

function solution(scores) {
    const answer = [];
    const length = scores.length;
    
    for(let i = 0; i < length; i++){
        const currentScore = scores[i][i];
        let max = -1;
        let min = 101;
        let count = 0;
        let sum = 0;
        let numOfStudent = length;
        
        for(let j = 0; j < length; j++){
            max = max < scores[j][i] ? scores[j][i] : max;
            min = min > scores[j][i] ? scores[j][i] : min;
            count += scores[j][i] === currentScore ? 1 : 0;
            sum += scores[j][i];
        }
        
        if(count === 1){
            if(currentScore === max || currentScore === min){
                numOfStudent--;
                sum -= currentScore;
            }
        }
        
        answer.push(grade(sum / numOfStudent));
    }
    
    return answer.join("");
}
728x90
반응형