name과 yearning은 각 사람에 대한 추억점수를 답은 배열이다. 나의 접근은 두 배열을 하나의 객체로 만들어서, photo에서 해당되는 요소를 찾아서 값을 반환해 주는 것으로 접근했다.
function solution(name, yearning, photo) {
const lists = {};
for(let i =0; i<name.length; i++) {
lists[name[i]] = yearning[i]
};
const count = [];
for(let i =0; i<photo.length; i++) {
count.push(photo[i].map(el => lists[el] ? lists[el] : 0))
}
return count.map(el => el.reduce((pre, cur) => pre+cur))
}
function solution(name, yearning, photo) {
// return photo.map((v)=> v.reduce((a, c)=> a += yearning[name.indexOf(c)] ?? 0, 0))
return photo.map((v)=> v.reduce((a, c)=> a + (yearning[name.indexOf(c)] ?? 0), 0))
}
정말 간단하게 풀어버렸다.
위의 사례에서 보는 것은 간단하다고 무조건 성능이 좋은 것은 아니다. 여기서도 simple is Best는 통하는 것 같다. 그럼에도 코드를 해석해보면 아래와 같다.
첫째, photo를 map을 통해서 배열의 요소마다 순환한다.
둘째, 그리고 들어온 배열을 하나의 값으로 출력하여 내보낸다. 이렇게 하여도, photo의 배열의 길이는 변하지 않기에 map은 정상동작된다.
셋째(1), reduce에서 누산값으로 값을 출력하는데 여기가 조금 복잡하다.
셋째(2), c의 현재값은 yearning의 숫자 배열에서 찾을 것인데, 해당 index는 name.indexOf(c)에서 찾은 값이다. 이를 통해서 내가 lists 객체를 만든 것을 처리하였다.
셋째(3), 그러나 찾을 수 없는 이름이 존재할 수 있다. 이때 ?? 연산자를 사용하였다. 즉 좌항이 null, undefinded면 우항을 실행하는 것이다. 즉 && 연산자와 다르다. && 연산자는 좌항이 true이면 우항을 실행한다. 즉 찾을 수 없는 값이 들어오면 0을 반환하여 누상되록 한 것이다.
코드는 어떻게 접근하는지에 따라서 너무나 상이하다. 그래서 많이 보고 많이 경험하는 것이 자신인 것 같다.