본문 바로가기
코테

[JS] 추억점수 _ 이걸 한줄로 쓴다고?

by zenna 2024. 3. 13.
728x90
점수 :1092 (+1)
테스트케이스 최대 소요시간 : 1.57ms

 

문제 요약

//

 

제출답안

function solution(name, yearning, photo) {
    var answer = [];
    let miss = {}; 
    name.forEach((n, index)=>{ miss[n] = yearning[index] });
    
    photo.forEach((pho, index)=>{ 
        let nowMissCount = 0; 
        pho.forEach((member,index2)=>{
            nowMissCount += (miss[member]) ? miss[member] : 0 ; 
        })
        answer[index] = nowMissCount;
    })
    return answer;
}

 

문제해설

function solution(name, yearning, photo) {
    // name[i] == yearning[i]
    // 사진에 등장하는 사람중 name에 포함된 사람의 점수만 합산하면 됨
    var answer = [];
    let miss = {}; // {이름: 그리움점수, ...}
    name.forEach((n, index)=>{ miss[n] = yearning[index] });
    
    photo.forEach((pho, index)=>{ // photo 배열을 순회
        let nowMissCount = 0; // 해당 photo의 추억 점수
        pho.forEach((member,index2)=>{
            //그리움 점수가 있는 인물이라면 점수를 더하되, undefined라면 0을 더합니다.
            nowMissCount += (miss[member]) ? miss[member] : 0 ; 
        })
        answer[index] = nowMissCount;
    })
    return answer;
}

 

그렇지만 충격적이게도 이 문제의 베스트 답변은 한줄이었다.ㅎ

보기가 난해하게 생겼으므로 줄바꾸고 뜯어보기 시작

return photo.map((v)=> 
    v.reduce((a, c)=> 
        a += yearning[name.indexOf(c)] ?? 0, 0)
    )

#map

map은 원본 배열을 변경하지 않으면서 각 요소를 순회하며 로직을 수행하고 수행한 리턴값을 새로운 배열에 담아 리턴한다. 배열.map((요소값, 인덱스, 배열)=>{ ...로직...}); 형태로 사용하는데

위 경우에는 인덱스와 원본 배열은 사용하지 않고 요소값(배열의 값)만 사용하신 모양. 리턴을 따로 객체화하지 않고 바로 리턴하기 위해 사용하셨나보다. 

배열의 값을 받아서 이번에는 reduce를 씀. 

#reduce

배열.reduce((이전 순회에서 넘겨받은 값, 배열에서 지금 확인하고 있는 값, 인덱스, 배열원본) => 실행할 로직, 초기값)

으로 사용한다. 

따라서 

[3, 5, 7, 9].reduce((beforeX, currentV, index, arrayA)=> beforeX + currentV , 0) 는 

배열 [3, 5, 7, 9]의 길이인 4만큼의 순회를 돌게 되고

beforeX  ( 이전 순회에서 넘겨받은 값 ) currentV ( 배열[index] ) index ( 인덱스) arrayA ( 배열원본 )
0 (= 초기값) 3 0 [3, 5, 7, 9]
3 (=0+3) 5 1 [3, 5, 7, 9]
8 (=3+5) 7 2 [3, 5, 7, 9]
15 (=8+7) 9 3 [3, 5, 7, 9]
24 (=15+9)      

를 거쳐 24가 리턴되는 방식.

따라서 reduce를 통해 photo[?] 인 배열의 값들을 순회하면서 그리움 점수를 합산해 map으로 리턴해주고, map은 그것들을 담아 리턴해준 셈!


다음 로직도 획기적. 

변수 += x ?? 0  ;

x가 undefined나 null 이면 x 대신 0을 더해준다.

이야...

728x90

댓글