[programmers] 완주하지 못한 선수

곽형조 (KCena)·2020년 4월 24일
0

완주하지 못한 선수

github : 완주하지 못한 선수

1. 이해

  • 마라톤에 참여한 선수들 중 완주하지 못한 선수를 return 한다.

2. 계획

  • 마라톤에 참여한 선수(participants)와 완주한 선수 배열(completions)을 정렬한다.
const solution = (participants, completions) => {
  participants = participants.sort();
  completions = completions.sort();
};
  • participants 목록은 completions 보다 항상 한 개 더 많기 때문에 participants 목록을 기준으로 filter 메서드를 적용한다. 정렬되어 있기 때문에 0번 index부터 마지막까지 비교하다 보면 일치하지 않은 선수가 담겨있는 배열을 구할 수 있다. 이 배열의 0번 index 값을 반환하면 완주하지 못한 선수를 반환할 수 있다.
const solution = (participants, completions) => {
  participants = participants.sort();
  completions = completions.sort();
  return participants.filter(
    (participant, index) => completions[index] !== participant
  )[0];
};

3. 실행

실행 결과

4. 반성

  • 완주한 선수들이 참가자 목록에 모두 있을 때 참가자 목록의 마지막 값이 정답이 될 것이다. 예를 들어 참가자 목록과 완주한 사람 목록이 ["kiki", "eden", "leo"], ["eden", "kiki"]
    와 같다면 "leo" 가 정답이 된다. 나는 참가자 목록의 배열에 filter를 적용하면서 completions 배열의 index 범위에서 벗어난 위치에 접근하면 안되지 않은가? 라는 생각에 filter가 빈 배열을 반환했을 시 참가자 목록의 마지막 원소를 반환하도록 아래와 같이 단축 평가를 이용했다.
  return (
    participants.filter(
      (participant, index) => completions[index] !== participant
    )[0] || participants[participants.length - 1]
  );
  • 하지만 javascript에는 배열의 길이가 고정되어 있지 않다. 배열의 요소에 접근할 시 잘못된 요소에 접근하면 undefined를 반환하기 때문에 filter가 잘 작동한다.
  • javascript의 배열 메서드에는 find가 있다. filter를 사용하면 새로운 배열을 반환하기 때문에 배열의 첫 번째 요소를 반환해야 하므로 [0]을 붙여야 했다. 이 부분이 마음에 들지 않았고, 이 문제를 풀 땐 가독성을 생각하면 find를 사용하는것이 더 적절하다고 생각한다.
const solution = (participants, completions) => {
  participants = participants.sort();
  completions = completions.sort();
  return participants.find((it, index) => it !== completions[index]);
};

0개의 댓글