상호평가

은유로그·2021년 9월 13일
0

👩‍💻 algorithm

목록 보기
1/11
post-thumbnail

🔨 오늘의 문제 : 상호평가

문제 간단 설명

  • 0번 학생부터 n번 학생까지 각자에게 점수를 부여한다. 학생들의 점수가 담긴 정수형 2차원 배열 scores가 매개변수로 주어진다. (nxn 2차원 배열)
  • 제외할 점수는 제외하고 평균을 구한 후, 아래 기준에 따라 학생들의 학점을 구하여 하나의 문자열로 만들어서 출력한다.
  • 만약, 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수는 제외하고 평균을 구한다.
  • 90점 이상 A
  • 80점 이상 90점 미만 B
  • 70점 이상 80점 미만 C
  • 50점 이상 70점 미만 D
  • 50점 미만 F

입출력 예시

  • 입력 : scores, 출력 : result
  • 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]]
  • result = "FBABD"
  • scores = [[50,90],[50,87]]
  • result = "DA"

📝 내가 생각한 수도 코드

  1. 새로운 배열 score = [[0이 받은 점수], [1이 받은 점수], [2가 받은 점수], [3이 받은 점수], [4가 받은 점수], [n이 받은 점수]]를 구한다.
  2. score의 각 요소에서 본인한테 준 점수가 유일하고, 최고점 혹은 최저점인지 확인한다.
    예) 배열 [0이 받은 점수] 요소들 중 [0][0]가 유일하고 max or min인지 확인한다.
  3. 조건이 맞다면 해당 배열에서 본인 점수를 삭제한다.
    예) [0이 받은 점수].splice(0, 1)
  4. 새롭게 정의된 score의 각 요소들의 평균값을 구한 뒤 새로운 배열(avg)에 할당한다.
    예) 배열 [0이 받은 점수]의 각 요소들을 다 더한 뒤 [0이 받은 점수]의 길이만큼 나눈다.
    avg = [0의 평균값, 1의 평균값, 2의 평균값, 3의 평균값, 4의 평균값]이 된다.
  5. 해당 평균값에 맞는 학점(grade)으로 치환한다.
  6. grade는 배열이기 때문에 grade.join()을 통해 문자열로 리턴한다.

💻 내가 구현한 코드

function solution(scores) {
    // score = [[0이 받은 점수], [1이 받은 점수], [2가 받은 점수], [3이 받은 점수], [4가 받은 점수]]를 구한다.
    let score = new Array(scores.length).fill(0).map((el) => new Array(scores.length).fill(0))
    for(let i = 0; i < score.length; i++){
        for(let j = 0; j < score.length; j++){
            score[i][j] = scores[j][i];
        }
    }
    
    // score의 각 요소에서 본인한테 준 점수가 유일하고, 최고점 혹은 최저점인지 확인한다.
// 예) 배열 [0이 받은 점수] 요소들 중 [0][0]가 유일하고 max or min인지 확인한다.
    const isUniqueMaxMin = (arr, num, idx) => {
        let max = Math.max(...arr);
        let min = Math.min(...arr);
        
        for(let i = 0; i < arr.length; i++){
            if(num === arr[i] && i !== idx) return false;
        }
        if(max === num || min === num) return true;
        return false;
    }
    
    // 조건이 맞다면 해당 배열에서 본인 점수를 삭제한다.
    // 예) [0이 받은 점수].splice(0, 1)
    for(let i = 0; i < score.length; i++){
        if(isUniqueMaxMin(score[i], score[i][i], i)) score[i].splice(i, 1);
    }
    
    // 새롭게 정의된 score의 각 요소들의 평균값을 구한 뒤 새로운 배열(avg)에 할당한다.
    // 예) 배열 [0이 받은 점수]의 각 요소들을 다 더한 뒤 [0이 받은 점수]의 길이만큼 나눈다.
    // avg = [0의 평균값, 1의 평균값, 2의 평균값, 3의 평균값, 4의 평균값]
    let avg = new Array;
    for(let i = 0; i < score.length; i++){
        avg.push(score[i].reduce((acc, cur) => acc + cur) / score[i].length);
    }
    
    // 해당 평균값에 맞는 학점(grade)으로 치환한다.
    let grade = new Array;
    for(let i = 0; i < avg.length; i++){
        if(avg[i] >= 90) grade.push('A');
        else if(avg[i] >= 80) grade.push('B');
        else if(avg[i] >= 70) grade.push('C');
        else if(avg[i] >= 50) grade.push('D');
        else grade.push('F');
    }
    
    // grade.join()을 통해 문자열로 리턴한다.
    return grade.join('');
}

🤔 느낀점

문제를 처음 읽었을 땐 복잡하다고 느꼈는데 생각보다 술술 풀려서 놀랬다. ㅎㅎ 보기 쉽게 작성하느라 구구절절한 느낌이 들지만... 그래도 만족한다. ㅎㅎㅎ
일단 함수를 사용한 내 자신 칭찬해~~ 함수를 만들고 그걸 이용하는게 이젠 두렵지가않다! fill, map, reduce, splice, push, join 등 많은 메소드를 사용한 것도 칭찬해~~~👏 JS 문법에 많이 익숙해진 거 같아 쪼꿈은 뿌듯하다. ๑•‿•๑
하나 아쉬운 점은 분명.. 이것보단 덜 써도 되겠지..?싶은 생각이 자꾸 든다는 것. 알고리즘 다운 알고리즘을 구현하기 위해 숏코딩을 써보도록 좀 더 고민해보자!
그리고 시간이 된다면 java로 구현해보자. ^-^

출처 : 프로그래머스 2주차_상호평가

profile
๑•‿•๑

0개의 댓글