[코딩 기초 트레이닝] 제목
구분
코딩 테스트 연습 > 코딩 기초 트레이닝
풀이 요약
참석한 학생들의 순위를 정렬하여 상위 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에 추가합니다.
- i=0: attendance[0] === true, temp = [5]
- i=1: attendance[1] === false, temp = [5]
- i=2: attendance[2] === true, temp = [5, 1], 정렬 후 temp = [1, 5]
- answer = 10000 * rank.indexOf(1) + 100 * rank.indexOf(5) + rank.indexOf(temp[2]) (오류 발생)
- i=3: attendance[3] === true, temp = [1, 5, 4], 정렬 후 temp = [1, 4, 5]
- answer = 10000 * rank.indexOf(1) + 100 * rank.indexOf(4) + rank.indexOf(5) = 10000 * 2 + 100 * 3 + 0 = 2300
- 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는 _에 할당되어 실제로 사용되지 않습니다.
따라서, _는 코드의 가독성을 높이기 위해 사용되며, “이 위치의 값은 중요하지 않다”는 의미를 전달합니다.
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 자릿수 더하기 (0) | 2024.07.25 |
---|---|
[프로그래머스] 문자열 내 p와 y의 개수 (2) | 2024.07.25 |
[코딩 기초 트레이닝] 배열 만들기 2 (3) | 2024.07.23 |
[코딩 기초 트레이닝] A 강조하기 (2) | 2024.07.18 |
[코딩 기초 트레이닝] 특정한 문자를 대문자로 바꾸기 (0) | 2024.07.18 |