본문 바로가기

코테/프로그래머스

[코딩 기초 트레이닝] 전국대회 선발고사

728x90

[코딩 기초 트레이닝] 제목

문제 링크

구분

코딩 테스트 연습 > 코딩 기초 트레이닝

풀이 요약

참석한 학생들의 순위를 정렬하여 상위 3명의 인덱스를 기반으로 점수를 계산합니다.

나의 풀이

function solution(rank, attendance) {
    let answer = 0;
    let temp=[];
    for(let i=0; i<attendance.length; i++){
        if(attendance[i]===true){
            temp.push(rank[i])
            temp.sort((a,b)=>a-b)
            answer=10000*rank.indexOf(temp[0]) + 100*rank.indexOf(temp[1]) + rank.indexOf(temp[2])
        }
        else if(attendance[i]===false) {continue}
    }
    return answer;
}

attendance[i]가 true인 경우, 해당 rank[i]값을 temp 배열에 추가합니다.

temp 배열을 오름차순으로 정렬하여 가장 작은 세 개의 값을 맨 앞에 배치합니다.

원래 rank배열에서 이 값들의 인덱스를 찾기위해 indexOf 메서드를 사용하였습니다.

attendance가 true인 경우에 해당하는 rank 요소들을 temp에 추가합니다.

  1. i=0: attendance[0] === true, temp = [5]
  2. i=1: attendance[1] === false, temp = [5]
  3. i=2: attendance[2] === true, temp = [5, 1], 정렬 후 temp = [1, 5]
  4. answer = 10000 * rank.indexOf(1) + 100 * rank.indexOf(5) + rank.indexOf(temp[2]) (오류 발생)
  5. i=3: attendance[3] === true, temp = [1, 5, 4], 정렬 후 temp = [1, 4, 5]
  6. answer = 10000 * rank.indexOf(1) + 100 * rank.indexOf(4) + rank.indexOf(5) = 10000 * 2 + 100 * 3 + 0 = 2300
  7. i=4: attendance[4] === false, temp = [1, 4, 5]

최종 temp 배열은 [1, 4, 5]이며, 이들의 인덱스는 [2, 3, 0]입니다. answer는 10000 * 2 + 100 * 3 + 0 = 20300이 됩니다.

배운점

function solution(rank, attendance) {
  const [a, b, c] = rank
    .map((r, i) => [r, i])
    .filter(([_, i]) => attendance[i])
    .sort(([a], [b]) => a - b);
  return 10000 * a[1] + 100 * b[1] + c[1];
}
rank.map((r, i) => [r, i])

rank 배열의 각 요소와 해당 인덱스를 [r,i] 형태로 묶어 새로운 배열을 만듭니다.

예를 들어, rank=[5,3,1]이라면 , [[5,0], [3,1], [1,2]] 와 같은 형태가 됩니다.

 .filter(([_, i]) => attendance[i])

attendance 배열에서 true인 인덱스에 해당하는 요소만 필터링 합니다.

예를 들어, attendance= [true, false, true]면 [[5,0], [1,2]]가 반환됩니다.

.sort(([a], [b]) => a - b)

필터링된 배열을 rank값을 기준으로 오름차순 정렬합니다.

예를 들어, [ [5, 0], [1, 2] ]는 [ [1, 2], [5, 0] ]가 됩니다.

const [a,b,c] = ...

정렬된 배열의 상위 세 개의 요소를 a,b,c에 할당합니다.

 

위 풀이를 보면서 구조분해 할당과 _에 대해 배웠습니다.

const array = [1, 2, 3, 4, 5];

// 배열의 값을 매핑하여 각 요소와 해당 인덱스의 배열로 만듦
const indexedArray = array.map((value, index) => [value, index]);
// indexedArray = [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4]]

// 인덱스가 짝수인 요소만 필터링
const filteredArray = indexedArray.filter(([_, index]) => index % 2 === 0);
// filteredArray = [[1, 0], [3, 2], [5, 4]]

_의 의미

_는 구조분해 할당의 첫번째 요소를 받아들이지만 실제로 이 값을 사용하지 않겠다는 의미로 쓰입니다.

위 코드에서 filter함수는 indexedArray 에서 인덱스가 짝수인 요소들만 남기는데, 이때 첫 번째 요소 value는 _에 할당되어 실제로 사용되지 않습니다.

따라서, _는 코드의 가독성을 높이기 위해 사용되며, “이 위치의 값은 중요하지 않다”는 의미를 전달합니다.

728x90