본문 바로가기
코딩테스트/프로그래머스

[프로그래머스] 위클리 챌린지 > 2주차 - 자바스크립트

by 핸디(Handy) 2021. 8. 17.

[ 문제 설명 ]

 

코딩테스트 연습 - 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


[ 아이디어 ]

이번 문제는 로직에 따라 천천히따라가며 구현하는 문제였다. 따라서 각 로직별 함수를 나눠서 구현하는게 좋을 것같다.

  1. 2차원 배열에서 특정 학생의 성적만 가져오기
  2. 최소, 최대값을 고려하여 평균값 가져오기
  3. 평균값으로 점수구하기
  4. 성적 합치기

[ 코드 ]

function solution(scores) {
    let answer = '';
    scores.forEach((item, index) => {
        let targetScore = scores.map(item => item[index]) // 해당 학생의 성적만 가져오기
        let avgScore = getAvgScore(targetScore, index) // 최소, 최대값 고려하여 평균값 가져오기
        let grade = getGrade(avgScore) // 점수로 성적가져오기
        return answer += grade // 성적 합치기
    })
    return answer;
}

function getAvgScore(scoreArray, index) {
    let avgScore = 0
    let min = scoreArray.reduce((acc, val) => {
        return acc < val ? acc : val;
    });
    let max = scoreArray.reduce((acc, val) => {
        return acc > val ? acc : val;
    });
    let sumScore = scoreArray.reduce((a, b) => a + b, 0);

    avgScore = (sumScore) / scoreArray.length
    if (min == scoreArray[index] && scoreArray.filter(item => item == min).length == 1) {
        avgScore = (sumScore - min) / (scoreArray.length - 1)
    }
    if (max == scoreArray[index] && scoreArray.filter(item => item == max).length == 1) {
        avgScore = (sumScore - max) / (scoreArray.length - 1)
    }

    return avgScore
}

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

[ 다른 코드 ]

let solution = scores =>
    (scores[0].map((_, c) => scores.map(r => r[c])))
        .map((s, i) => [...s.splice(i, 1), s])
        .map(([m, s]) => Math.min(...s) <= m && m <= Math.max(...s) ? [m, ...s] : s)
        .map(s => "FDDCBAA"[Math.max(parseInt(s.reduce((a, c) => a + c) / s.length / 10) - 4, 0)])
        .join("")

일단 멋있다.  감탄스러울 따름이다. 하지만 실무에선 해당 코드를 쓰진 않을것같다. 직관적이지기 않은 숏코드가 많다. 물론 내가 이것을 한눈에 보고 읽지 못하기 때문에 직관적이지 못하다고 생각할 수도 있지만 말이다.

댓글