[프로그래머스 코딩테스트 기초] 전국 대회 선발 고사 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2023년 12월 13일
0

코딩테스트연습

목록 보기
25/106
post-thumbnail

1. 문제 설명

2. 제한 사항

3. 입출력 예

4. 입출력 예 설명

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

이번 문제는 for문을 이용해 주어진 rank(랭킹)와 attendance(참석 여부) 배열에 맞춰 참석 하는 사람들만 저장하는 배열 (attendedStudent)와 해당 참석자들의 등 번호(indexOf 메서드로 저장한 indexIs) 배열을 저장한 후

다음 이중 for문을 돌려 attendedStudent 가장 작은 값(랭킹이 작아야 배열에서 성적이 우수한 학생이므로)을 찾은 값을 하나의 변수에 집어넣고, for문이 도는 attendedStudent 배열에서 해당 변수의 값과 일치할 때 (성적이 우수한 학생을 찾았을 때) rangedRank 배열에 해당 indexIs 메서드의 현재 i의 값(성적이 우수한 학생의 등 번호)를 push 한 후

attendedStudent배열과 indexIs 배열의 현재의 i값(성적이 가장 우수한 학생과 그 등 번호)를 삭제 (splice)한 후 다시 for문을 돌아 다음 성적이 우수한 학생과 이에 대한 작업을 처리하는 방식으로 구현했습니다.

function solution(rank, attendance) {

    let answer = 0; 
    let attendedStudent = []; // 최종 참석자 명단을 저장할 배열 
    let backNumber = []; // 최종 참석자의 등번호를 저장할 배열
    let rangedRank = []; // 순위대로 등번호를 다시 저장할 배열

    for (let i = 0; i < rank.length; i++) { // 첫번째 for문은 해당 참석자의 참여 여부가 true일 경우 이에 위치한 랭커(rank)를 참석자 명단에 저장하고 해당하는 등 번호(i의 값은 해당 참석자의 인덱스라고 봐도 무방)을 등 번호 배열에 저장.
        if (attendance[i] === true) {
            attendedStudent.push(rank[i]);
            backNumber.push(i); // backNumber 배열에 인덱스를 직접 추가
        }
    }

    let length = attendedStudent.length; // attendedStudent의 배열을 length 변수에 저장 (아래의 두번째 for문을 돌리면서 splice로 인해 해당 배열의 length가 줄어들기 때문)
    for(let i = 0 ; i < length ; i++){ // 첫번째 for문은 length에 저장된 길이만큼 돌리고
        for(let j = 0 ; j < attendedStudent.length ; j++){ // 두번째 for문은 attendedStudent의 길이만큼 반복하면서
            let minValue = Math.min(...attendedStudent); // 최솟값 변수에 참석자 명단의 학생들 중 값이 가장 낮은 값(그룹 내에 가장 우수한 학생)을 담아주는데, 해당 메서드는 배열을 받을 때 배열 그 자체를 하나의 인자로 받으므로 연산을 할 수 없습니다. 그래서 스프레드 연산자를 사용해 배열의 값들을 전부 분해해 줍니다.)
                if (attendedStudent[j] === minValue) { // 만약 참석자 명단 중에 가장 우수한 학생을 찾는다면
                rangedRank.push(backNumber[j]); // rangedRank에 해당 학생을 push 해준 후
                backNumber.splice(j, 1); // 등번호 명단의 해당 학생을 splice로 제거
                attendedStudent.splice(j, 1); // 마찬가지로 참석자 명단의 해당 학생을 splice로 제거해 줍니다.
                }
        }
    }
    return answer = ((10000 * rangedRank[0]) + (100 * rangedRank[1]) + rangedRank [2]); // 이렇게해서 최종적으로 반환 된 rangedRank의 값들을 이용해 순차적으로 연산한 결과값을 answer에 할당 후 반환시켜 줍니다.
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글