[프로그래머스 코딩테스트 입문] 등수 매기기 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2023년 12월 13일
0

코딩테스트연습

목록 보기
27/106
post-thumbnail

1. 문제 설명

2. 제한 사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2023-12-13)

이 문제는 for문 1개와 중첩 for문 2개, 총 3개의 for문 구역을 활용하여 문제를 해결했는데요.

첫번째 for문은 rank 배열에 1을 채워넣는 역할을 하고, 두번째 for문은 score 배열의 학생(score 안의 배열 하나 하나)들을 선택하고, 그 학생의 수학과 영어 점수를 합한 후 averageScore(평균 배열)에 push 해주는 역할을 하며

세번째 for문은 평균 배열(averageScore)을 순회하면서 현재의 점수가 다른 점수들보다 낮을 경우 rank의 현재 i번째 (현재 학생의 등수)를 증가(순위에서 점점 밀려남) 시켜줍니다.

이 방법 말고도 rank를 1이 아니라 score.length로 채운 후 마지막 for문의 조건에서 현재 학생이 다른 학생보다 등수가 높을 경우 rank의 현재 i번째 값을 감소(랭킹 상승) 시켜보려고 했는데 안되더라고요... 뭐가 문제인지 생각을 해봤는데

같은 동점의 학생이 존재할 경우 등수를 하나 감소시키지 않는 현상이 벌어지더랍니다. 그래서 >=(크거나 같다) 조건을 넣었더니 랭크가 오히려 -2 되어버리는 현상(그 이유는 두번째 for문에서는 배열의 처음부터 끝까지 돌아가기 때문에 자기 자신 또한 비교의 범위에 놓여지기 때문)이 발생해서 그냥 랭크를 올리는 식으로 해결을 했습니다.

function solution(score) {

    let averageScore = [];
    let rank = [];
    for(let i = 0; i < score.length ; i++){ // 첫번째 for문은 rank 배열을 1로 채웁니다. (rank.fill(1) 을 써도 되는데 일단 for문에 익숙해지기로 했습니다.)
        rank.push(1);
    }

    for(let i = 0; i < score.length ; i++){ // 두번째 for문
        let sum = 0; // 학생 마다 구할 합계 변수를 상위 for문이 반복되는 동안 초기화
        for(let j = 0; j < score[i].length ; j++){ // 학생을 선택하여 그 학생의 영어(첫번째 인덱스[i][0])과 영어(두번째 인덱스[i][1])을 sum에 누적 합산합니다.
            sum += score[i][j];
        }
        averageScore.push(sum/score[i].length); // 평균 배열에는 해당 학생의 합계에 해당 학생의 과목 수의 합으로 나눈 값을 push 해줍니다.
    }
 
    for(let i = 0; i < averageScore.length ; i++){ // 세번째 for문
        for(let j = 0; j < averageScore.length ; j++){ // 이중 for문으로 현재 학생(i)의 평균과 다른 학생(for문 j는 처음부터 끝까지 돌아가도록 범위를 잡음)의 평균과 비교 했을 때 다른 학생의 점수가 더 높을 경우 
            if(averageScore[i] < averageScore[j]) rank[i]++; // 현재 학생의 등수를 상승(등수가 떨어지는 효과)
        }
    }
    let answer = []; 
    return answer = rank; // 모든 for문의 처리가 끝난 후 rank 배열을 answer에 할당 후 반환.
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글