문제: https://programmers.co.kr/learn/courses/30/lessons/42576

코드1.

function solution(participant, completion) {
  participant.sort();
  completion.sort();
  const res = participant.find((player, idx) => player !== completion[idx]);
  return res;
}

처음엔 반복문, includes면 금방이겠거니했다.

하지만 동명이인이 있을 수도 있다는 전제로 인해 방법을 찾다가 어차피 value는 한가지 빼고 같을테니 정렬 후 비교하게 로직을 세웠다. find()를 사용한 이유는 완주하지 못한 선수가 한 명이라는 조건으로 가능했다. 인자 함수를 통과하는 첫번째 요소만 반환될테니!

그런데 만약 완주하지 못한 선수가 한 명이 아니라면? 여기서는 생각이 나지 않아 다른 사람들의 코드를 보기 시작했다.

코드2. 어느 배우신 분의 코드

function solution(participant, completion) {
    const hash = {};

    for(let val of participant) {
      if(!hash[val]) hash[val] = 0;
      hash[val]++;
    }

    const result = completion.forEach(val => hash[val]--);

    for(let key in hash) if(hash[key]) return key;
}

이 코드를 보니 완주하지 못한 선수가 한명이 아닐 때에도 답을 쉽게 찾을 수 있어서 가져왔다.

일단 객체를 하나 생성한 후에, 이름을 key값으로 생성하고 value는 그 이름의 개수가 된다.

그리고 나서는 완주한 사람의 이름 배열을 돌리면서 해당하는 이름(key)의 value를 하나씩 줄인다.

그렇게 되면 완주하지 못한 사람은 객체에서 value가 1이상인 key이다.

반환할때는 한명이면 return으로 바로 반환하면 되고, 두명 이상일 경우 filter를 통해서 배열을 반환하거나 하면 되겠다

내일은 1일1코딩 대신 배열 메소드 나머지 정리와 오늘까지 한 세문제 정리를 해야겠다.

무조건 쉽게 푸는 것보다 자료구조를 생각하는 사고의 필요성을 느꼈다ㅠ_ㅠ

Leave a comment

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다