개발/코딩테스트

[프로그래머스 | JavaScript] 전국 대회 선발 고사

prpn97 2023. 9. 11. 23:37

문제 설명


0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.

각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.

 

입출력 예

rank attendance result
[3, 7, 2, 5, 4, 6, 1] [false, true, true, true, true, false, false] 20403
[1, 2, 3] [true, true, true] 102
[6, 1, 5, 2, 3, 4] [true, false, true, false, false, true] 50200

 

문제 풀이

 

function solution(rank, attendance) {
  let answer = 0;
  const originRank = [...rank];
  const sortRank = rank.sort((a, b) => a - b);
  let sortAttendance = [];
  for (let i = 0; i < rank.length; i++) {
    sortAttendance.push(attendance[originRank.indexOf(sortRank[i])]);
  }
  const trueArr = sortAttendance
    .map((v, i) => (v === true ? i + 1 : undefined))
    .filter((index) => index !== undefined);

  const answerRank = trueArr.map((v) => originRank.indexOf(v));
  answer = answerRank[0] * 10000 + answerRank[1] * 100 + answerRank[2];
  return answer;
}

 

1. originRank에 기존 rank 배열을 저장한다. 

2. sortRank에 rank를 등수대로 정렬한다. 

3. rank를 정렬했을 때 각 sortRank의 attendace가 true / false 인지 sortAttendance에 새로 담는다. 

 

여기까지 하게 되면 sortRank에는 1,2,3,... 순서대로 담기고, 1등부터 각 차례로 true, false가 정리된다. 

 

이제 진행할 것은 true인 값만 추리고, 처음 rank의 위치로 변환한다. 

 

1번 테스트케이스로 예시를 들어보겠다. 

originRank = [3, 7, 2, 5, 4, 6, 1]  attendance [false, true, true, true, true, false, false]

sortRank = [1, 2, 3, 4, 5, 6, 7] sortAttendance [false, true, false, true, true, false, true]

sortRank의 각 값은 등수이므로 등수에 해당하는 originRank의 attendance를 맞춰줬고,

sortAttendance 에서 1등 false 2등 true, 3등 false 4,5등 true 6등 false, 7등 true로 확인할 수 있다. 

 

등수가 높은 순서대로 true인 3개의 값을 가져오게 되면 2,4,5 등이 true다.

trueArr = [2, 4, 5]가 들어간다. 

등수는 알지만 해당 등수인 학생을 알아야 하므로 등수대로 나열해서 true만 추려낸 trueArr에서 해당 2,4,5등이 기존 originRank에서 몇번에 위치해있는지 indexOf로 map을 돌린다. 

 

originRank = [3, 7, 2, 5, 4, 6, 1] 에서 2,4,5등은 2, 4, 3번 인덱스에 위치한다. 

 

answerRank에는 [2, 4, 3] 이 된다. 

true에 값을 3개만 진작 추려내도 되지만, true가 많을 수 있다. 하지만 1~3등까지만 구하는 것이기 때문에 

answerRank에 값이 많이 들어오더라도 상관없다. 

 

이제 answerRank에 해당하는 1등인 2번, 2등인 4번, 3등인 3번 의 인덱스에 각각 10000, 100, 1을 곱한다. 

 

2번 * 10000 + 4번 * 100 + 3번 * 1 을 하게되면 20403이라는 결과가 나온다. 

728x90