[ 문제 설명 ]
[ 아이디어 ]
이번 문제는 로직에 따라 천천히따라가며 구현하는 문제였다. 따라서 각 로직별 함수를 나눠서 구현하는게 좋을 것같다.
- 2차원 배열에서 특정 학생의 성적만 가져오기
- 최소, 최대값을 고려하여 평균값 가져오기
- 평균값으로 점수구하기
- 성적 합치기
[ 코드 ]
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("")
일단 멋있다. 감탄스러울 따름이다. 하지만 실무에선 해당 코드를 쓰진 않을것같다. 직관적이지기 않은 숏코드가 많다. 물론 내가 이것을 한눈에 보고 읽지 못하기 때문에 직관적이지 못하다고 생각할 수도 있지만 말이다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 2018 KAKAO > 뉴스 클러스터링 - 자바스크립트 (0) | 2021.08.30 |
---|---|
[프로그래머스] 위클리 챌린지 > 4주차 - 자바스크립트 (0) | 2021.08.23 |
[프로그래머스] 위클리 챌린지 > 1주차 - 자바스크립트 (0) | 2021.08.17 |
[프로그래머스] 연습문제 > 숫자의 표현 - 자바스크립트 (0) | 2021.06.14 |
[프로그래머스] 2018Kakao > 파일명 정렬 - 자바스크립트 (0) | 2021.05.10 |
댓글