완주하지 못한 선수

YEONGHUN KO·2021년 11월 29일
0

ALGORITHMS - PRACTICE

목록 보기
26/50
post-thumbnail

1. 완주하지 못한 선수를 찾아내라

참가자와 완주한 선수를 pass하여 완주하지 못한 선수를 찾아낸다. 굉장히 간단한 문제이다

2. 접근 방법

참가자 hash 완주한 선수 hash 를 만들어서 비교한다음 완주한 선수가 참가자 안에 있으면 1을 뺀다.

그리고 1보다 크거나 같은 hash Key를 완주하지 못한 선수라고 보고 찾아내어 return한다.

paticipant = ["a", "b", "c", "d", "g"];
completion = ["b", "c", "g"];

function mySolution(paticipant, completion) {
  let answer;

  let pHash = {};
  let cHash = {};

  for (let i = 0; i < participant.length; i++) {
    pHash[participant[i]]
      ? (pHash[participant[i]] = ++pHash[participant[i]])
      : (pHash[participant[i]] = 1);
  }

  for (let j = 0; j < completion.length; j++) {
    if (pHash[completion[j]]) pHash[completion[j]] = --pHash[completion[j]];
  }

  for (let k in pHash) {
    if (pHash[k] >= 1) answer = k;
  }

  return answer;
}

일단 요것도 나쁘지 않은데 다른 사람 풀이방식을 보니 충격적으로 간단하게 만 들수 있다는 것을 배웠다.

function otherSolution(paticipant, completion) {
  return participant.find(
    (participant) => !completed[participant]--,
    completion.map(
      (participant) =>
        (completion[participant] = (completed[participant] | 0) + 1)
    )
  );
}

진짜 대박이다... find의 this arg를 활용할 생각을 하다니. 설명을 적어보면은.

find는 return값이 true인 첫 원소를 뽑아내고 find 함수는 바로 종료됨. 그리고 comma 뒤에는 this arg라고 보면 된다.
f
디버거를 돌려보니. 일단 this arg 자리에 선언된 함수를 정리한다. 그리고 나서 find를 실행시킨다.

this arg쪽에 있는 함수는 completion된 선수들이 몇명이 있는지 compeletion에 추가하는 함수이다.
따라서 예를 들어 c = ['a', 'b', 'c', 'g'] 라고 하면 this arg를 거치고 나면 ["a", "b", "c", "g", a: 1, b: 1, c: 1, g: 1] 라고 바뀌는 것이다.

그리고 나서 participants.find를 통해 completion에 없는 선수를 찾는다. !$[_]-- 의 의미는 compeleltion[participants선수] 의 값을 찾고 발견되면 하나씩 줄여나가는 것이다. -- 는 후위기술이므로 값이 변하기 전의 값을 리턴한다음 값이 줄어든다는 것을 염두해두자.

예를 들어, 이미 completion에 저장되어있는 값이 0이라고 하자(participants에 저장된 선수중에 완료한 선수를 모두 제외했다는 의미) 0 이 저장되어있는데 여기서 또 1을 뺀다면, 이말은 동명이인이라는 뜻이다. 즉, 이때 pass된 participants선수는 완료하지 못한 선수라는 의미이다.

또한 애초에 저장되어있지 않은 선수라고 하면 compeleltion[participants선수] 가 undefined로 뜰 것이다.

그래서 두 가지 경우 모두, !$[지금 pass된 선수]가 true를 리턴한다는 말이다.
그래서 이 선수가 return되고 find는 종료가 되면서 완주하지 못한 선수를 찾아낼 수 있게 된다.

가독성은 좋지 않다. 하지만 이러한 방법을 생각해내고 코드로 깔끔하게 옮겨낸 능력은 매우 훌륭하다고 생각한다.
또 배웠다.... 진짜 매일 배운다ㅋㅋㅋㅋ 너무 좋다!!!

끝!

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글