문법 질문드립니다!

안녕하세요 알고리즘 문제풀다가 이해가 안되는 구문이있어서 질문올려봅니다!

문제내용은 마라톤 참가자중 완주하지 못한 참가자를 찾는다는 내용으로
참가자 배열 participant 완주자배열 completion 을 받아서 완주를 못한사람을 return 하는 내용입니다.
아래가 solution 이구요.

function solution(participant, completion) {
    var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
    return participant.find(t=> {
        if(dic[t])
            dic[t] = dic[t]-1;
        else 
            return true;
    });
}

위 코드에서

(obj[t]= obj[t] ? obj[t]+1 : 1 , obj)

이 구문이 이해가 안갑니다. 제가 해당 문법을 모르고 있는거같은데
obj[t] 를 삼항연산으로 할당하는데 obj[t] 가 true 일 경우 obj[t]+1 (무슨 의미인지 모르겠습니다)
을 할당하고 false 일 경우 obj[t] 의 value를 1 로 할당한다(?)
그리고 마지막 ,obj 도 무슨의미인지도 모르겠습니다…
이 문법이 전체적으로 어떤식으로 사용되는지 설명해주실 수 있는분 부탁드립니다~!!

reduce 코드를 조금 더 풀어 쓰면 다음과 같습니다.

completion.reduce( (obj, t) => { 
  obj[t]=obj[t]?obj[t]+1:1; 
  return obj
}, {})

위 코드는 배열에 들어 있는 값이 몇번 나왔는지 카운트하도록 구현되어 있네요…

실제 실행을 시켜보면 다음과 같은 결과를 얻을 수 있습니다.

let completion =  ['a','b','c','a'];
let resut = completion.reduce( (obj, t) => { 
  obj[t]=obj[t]?obj[t]+1:1; 
  return obj
}, {});
// 결과 : result = {a: 2, b: 1, c: 1}

reduce의 callback에서 지정한 obj는 reduce가 실행되면서 계속 누적되어 전달되는 accumulator입니다. 따라서 처음은 지정한 초기값 {}로 시작합니다. 여기에 a라는 key에 값이 없으니 일단 1로 지정합니다. 이미 값이 있으면 +1 하는 코드입니다.

도움이 되었길 바랍니다. :slight_smile:

2개의 좋아요

, obj 는 찾아보니 이런 게 있네요!

코드가 좀 변태네요. ^^

객체에 접근할때 객체[키] 이렇게 접근할 수 있었군요
쉽게 풀어서 설명해주셔서 감사합니다!!