문제

items 배열이 주어질 때 ruleValue와 일치하는 원소의 갯수를 찾는 문제였습니다. 이때 ruleKey도 같이 주어지는데 단순히 ruleValue가 안에 있는지를 확인하는게 아닌 items 배열 원소를 item이라고 할 때 item의 각 자리마다 대응되는 ruleKey를 통해 해당 인덱스의 value가 ruleValue인지 찾는 문제였습니다

예제

Input: items = [["phone","blue","pixel"],["computer","silver","lenovo"],["phone","gold","iphone"]], ruleKey = "color", ruleValue = "silver"
Output: 1
Explanation: There is only one item matching the given rule, which is ["computer","silver","lenovo"].

해결한 코드

const TypeObject = {
    "type":0,
    "color":1,
    "name":2,
}

const countMatches = function(items, ruleKey, ruleValue) {
    // TypeObject["type"]
    const result = [...items].filter(v => {
        if(v[TypeObject[ruleKey]] === ruleValue) 
            return v
    })

    return result.length
};

단순하게 ruleKey에 따라 대응되는 TypeObject를 하나 만들어서 ruleKey가 주어졌을 때 해당 오브젝트에서 찾은 뒤 인덱스 번호를 반환시켜 비교하고 filter를 통해 일치하는 값들로만 리턴시킨 뒤 갯수를 붙여 값으로 출력시켰습니다.

남이 푼 코드

배열로 새로 만들어서 return 시키는 것보다는 훨씬 더 메모리면에서 효율적임과 동시에 더 깔끔하고 이해가 잘 되는 코드였습니다.
하지만 실력이 부족해서 runtime이 왜 더 빠른지 이해가 안되서 조금 더 찾아 볼 예정입니다

const countMatches = (items, ruleKey, ruleValue) => {
  let ans = 0;
  for (let i = 0; i < items.length; i++) {
    switch (ruleKey) {
      case 'type':
        if (items[i][0] === ruleValue) ans++;
        break;
      case 'color':
        if (items[i][1] === ruleValue) ans++;
        break;
      case 'name':
        if (items[i][2] === ruleValue) ans++;
        break;
    }
  }
  return ans;
};
복사했습니다!