[ 프로그래머스 코테 연습] - 2주차_상호평가

kgorae·2021년 9월 24일
0

알고리즘

목록 보기
19/19
post-thumbnail
  • 프론트엔드 직군의 코딩테스트는 언어가 javascript로 정해진 경우가 많아서, python 으로 준비하던 알고리즘 공부를 멈추고, js 로 최대한 풀어보는 중이다.
  • 메소드를 사용하기 전에 반복문으로 구현할 수 있어야 문제 해결 능력을 키울 수 있다는 조언을 받아들여, sort 함수도 쓰지 않으려 한다.
  • 하던 대로 벨로그에 풀이 코드를 올릴 생각인데, 다시 찾아보고 공부하기엔 깃허브에 올리는 것이 더 나을 수 있을 것 같아 고민 중에 있다.

1차 풀이(반복문)

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차 풀이(함수)

// 주어지는 데이터는 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차 풀이)

  • 반복문으로 구현하다 보니 알파벳 중복으로 에러가 나기도 했다. 그래도 확실히 머릿속에 있는 것을 논리로 펼치는 연습은 되는 것 같다. 계속 해 볼 예정.

참고

profile
좋은 개발자, 좋은 사람

0개의 댓글