완주하지 못한 선수 from 프로그래머스(javascript)

JellyChoco·2020년 7월 22일
1

1. 문제

2. 해석

문자열로 이루어진 2개의 배열의 공통value가 아닌 value를 찾는 문제이다.

3. 풀이

function solution(participant, completion) {
  
  let reducer = participant.reduce((allNames, name) => { //MDN reduce안에 나와있는 활용법중 하나이다.
    allNames[name] = allNames[name] ? allNames[name] + 1 : 1;
    return allNames;
  }, {}); // 이렇게 되면 reducer에는 전체 참가자의 {선수이름:중복횟수}로 구성된 객체가 생성된다.

  completion.forEach((key) => { // 도착한 선수의 이름이 들어 있는 배열을 forEach를 사용,
    if (reducer[key] && reducer[key] === 1) { //reduce객체의 [key]로 넣어 확인+ 동명이인 X
      delete reducer[key];                   //도착했으니까 그 선수이름과 동명이인여부를 지워준다
    } else if (reducer[key] && reducer[key] !== 1) {//위의 조건에서 동명이인이 있는 경우
      reducer[key] = reducer[key] - 1; // 동명이인이니까 value가 2이상일테고, 그렇다면 한명 지워준다.
    }
  });
  
  return Object.keys(reducer)[0]; //남은 키와 밸류는 도착하지 못한 1명, 만약 여러명인경우 반복문을돌려 반환해야 할것이다.
}

4. 후기

프로그래머스에서 해시 카테고리 안에 있길래 처음에 이게 왜.. 해시 관련 문제에 있지 라고 생각했다.

내가 아는 해시는 해시함수를 사용한 것 밖에 없었기에..

처음엔 indexOf를 활용해서 하려고 했었는데 중복의 경우의 어떻게 처리해야할지 생각이 안나서

저렇게 해결했다.

테스트는 통과했는데 약간 속도면에서 느린것 같다.

나름 만족한 풀이였다.

profile
코린이? 개린이!

0개의 댓글