[프로그래머스] 완주하지 못한 선수 - JavaScript

Chloé·2022년 3월 8일
2
post-thumbnail

완주하지 못한 선수 #해시

출처 - 프로그래머스 코딩테스트 고득점 KIT

💡 문제 접근하기

  • participant 배열을 순회하며 참가자 이름을 key, 해당 이름을 가진 참가자 인원 수를 value 값으로 가지는 해시 테이블을 생성한다.
  • completion 배열을 순회하며 해시 테이블에서 완주자 인원을 제외한다.
  • 단 한 명만 완주하지 못했다고 했으므로, 해시 테이블에는 value가 1인 key가 반드시 하나 남게 된다. 해당 key 값을 반환한다.

👉 Tip!

  • 완주자 목록을 순회하며 해시 테이블의 값을 하나씩 뺄 때, 남은 값이 0이라면 해당 key 자체를 삭제해준다. 마지막에 단 하나 남은 key를 반환하기 쉽다. 그렇지 않고 value 값을 0으로 남겨놓게 되면 맨 마지막에 맵이나 객체를 순회하면서 value가 1인 key를 찾아주는 조건을 한번 더 걸어줘야 한다.

🔥 문제 풀어보기

Map으로 풀어보기

function solution(participant, completion) {
  let answer = "";

  let pH = new Map();

  for (let p of participant) {
    pH.set(p, pH.get(p) + 1 || 1);
  }

  for (let c of completion) {
    if (pH.get(c) === 1) {
      pH.delete(c);
    } else {
      pH.set(c, pH.get(c) - 1);
    }
  }

  for (let [key, value] of pH) {
    answer = key;
  }
  
  return answer;
}

Object로 풀어보기

function solution(participant, completion) {
  let answer = "";

  let pH = {};

  for (let p of participant) {
    const val = pH[p] ? pH[p] + 1 : 1;
    pH[p] = val;
  }

  for (let c of completion) {
    if (pH[c] === 1) {
      delete pH[c];
    } else {
      pH[c] = pH[c] - 1;
    }
  }

  answer = Object.keys(pH)[0];
  
  return answer;
}

🚀 문제에서 배워보기

  • Map의 .set, .get, .has, .delete 메소드 익히기
  • Object의 .keys, .values, .entries 메소드 익히기

💫 덧붙이기

  • Map보다 Object로 다루는 것이 성능상 효율적이라고 해서 둘을 비교해봤는데, 눈에 띄는 차이는 없었다.
    • 약간의 차이는 있었는데, 실행할 때마다 조금씩 달라지는 걸 보면 실행 서버의 차이가 아닐까?
    • 이정도 알고리즘을 풀 때는 큰 차이는 없는 것으로!
  • 개인적으로는 해시 문제를 풀 때 Object보다 Map을 선호한다. 메소드가 좀더 직관적으로 느껴지기 때문.
profile
클로이 데일리 로그

0개의 댓글