- 프론트엔드 직군의 코딩테스트는 언어가 javascript로 정해진 경우가 많아서, python 으로 준비하던 알고리즘 공부를 멈추고, js 로 최대한 풀어보는 중이다.
- 메소드를 사용하기 전에 반복문으로 구현할 수 있어야
문제 해결 능력
을 키울 수 있다는 조언을 받아들여, sort 함수도 쓰지 않으려 한다.- 하던 대로 벨로그에 풀이 코드를 올릴 생각인데, 다시 찾아보고 공부하기엔 깃허브에 올리는 것이 더 나을 수 있을 것 같아 고민 중에 있다.
function solution(scores) {
const scoresLength = scores[0].length;
let nums = [];
let score_arr = [];
let temp = 0;
let result = 0;
let answer = "";
// 자기 자신 평가 점수 배열 생성
for(let i=0; i<scoresLength; i++){
nums.push(scores[i][i]);
}
// 자기 총 점수 배열 생성
for(let i=0; i<scoresLength; i++){
for(let j=0; j<scoresLength; j++){
score_arr.push(scores[j][i]);
}
// 오름차순 정렬
for(let k=0; k<scoresLength; k++){
for(let q=k+1; q<scoresLength; q++){
if((score_arr[k]-score_arr[q])>0){
temp = score_arr[k];
score_arr[k] = score_arr[q];
score_arr[q] = temp;
}
}
}
// 자기 자신 평가 점수가 최댓값, 최솟값, 유일값인지 확인
if(score_arr[0] === nums[i] || score_arr[scoresLength-1] === nums[i]){
let count = 0;
for(let m=0; m<scoresLength; m++){
if(score_arr[m] === nums[i]){
count += 1;
} else {
continue;
}
}
if(count === 1){
for(let n=0; n<scoresLength; n++){
result += score_arr[n]
}
result = (result - nums[i])/(scoresLength-1);
count = 0;
} else {
for(let p=0; p<scoresLength; p++){
result += score_arr[p]
}
result = result/scoresLength;
}
} else {
for(let p=0; p<scoresLength; p++){
result += score_arr[p]
}
result = result/scoresLength;
}
// 자기 총 점수 평균값 학점 구하기
if(result>=90){
answer += "A";
}else if(result>= 80 && result<90){
answer += "B";
}else if(result>= 70 && result<80){
answer += "C";
}else if(result>= 50 && result<70){
answer += "D";
}else if(result<50){
answer += "F";
}
result = 0;
score_arr = [];
}
return answer;
}
// 주어지는 데이터는 2차원 배열
function solution(scores) {
const scoresLength = scores[0].length;
let nums = [];
let score_arr = [];
let temp = 0;
let result = 0;
let answer = "";
// 자기 자신 평가 점수 배열 생성
for(let i=0; i<scoresLength; i++){
nums.push(scores[i][i]);
}
// 자기 총 점수 배열 생성
for(let i=0; i<scoresLength; i++){
for(let j=0; j<scoresLength; j++){
score_arr.push(scores[j][i]);
}
// 오름차순 정렬
score_arr.sort((a,b)=> a-b);
// 자기 자신 평가 점수가 최댓값, 최솟값, 유일값인지 확인
if(score_arr[0] === nums[i] || score_arr[scoresLength-1] === nums[i]){
let count = 0;
count = score_arr.reduce((cnt, elm)=> cnt + (elm === nums[i]),0);
if(count === 1){
result = ((score_arr.reduce((pre, cur) => pre+cur)) - nums[i] ) / (scoresLength - 1);
count = 0;
} else {
result = (score_arr.reduce((pre, cur)=> pre+cur)) / scoresLength;
}
} else {
result = (score_arr.reduce((pre, cur)=> pre+cur)) / scoresLength;
}
// 자기 총 점수 평균값 학점 구하기
if(result>=90){
answer += "A";
}else if(result>= 80 && result<90){
answer += "B";
}else if(result>= 70 && result<80){
answer += "C";
}else if(result>= 50 && result<70){
answer += "D";
}else if(result<50){
answer += "F";
}
result = 0;
score_arr = [];
}
return answer;
}
switch문으로 학점을 계산하면 가독성이 더 좋지 않을까 생각했는데, switch 문은 변수나 조건식을 case 뒤에 쓸 수 없다. switch () 괄호안에는 변수, 상수, 비교연산자 등 자유롭게 데이터가 올 수 있지만 case문 뒤에는 상수값만 올 수 있는 것!
정확성 테스트는 반복문이 더 좋아 보인다.(이미지 순서대로 1차 풀이, 2차 풀이)
반복문으로 구현하다 보니 알파벳 중복으로 에러가 나기도 했다. 그래도 확실히 머릿속에 있는 것을 논리로 펼치는 연습은 되는 것 같다. 계속 해 볼 예정.