완주하지 못한 선수

완주하지 못한 선수
1
2
3
4
5
6
7
8
9
10
11
12
13
// https://programmers.co.kr/learn/courses/30/lessons/42576
const solution = (participant, completion) => {
let objComletion = {};

completion.forEach((item) => {
!objComletion[item] ? (objComletion[item] = 1) : objComletion[item]++;
});

for (let i = 0; i < participant.length; i++)
if (!objComletion[participant[i]] || --objComletion[participant[i]] < 0)
return participant[i];
};
result = solution(['leo', 'kiki', 'eden'], ['eden', 'kiki']);
  • 효율성때문에 골치 아픈 문제

해설

  • solution(['leo', 'kiki', 'eden'], ['eden', 'kiki'])
  • 이런식으로 이름이 들어간 2개의 배열이 들어온다
  • 첫번째 배열은 참가자명단이고
  • 두번째 배열은 완주자명단이다
  • 완주하지 못한 사람을 반환하면 된다
  • 그런데 동명이인이 있을 수 있다
  • 중첩 반복문으로 풀다가 효율성에서 실패했다
  • 해쉬를 써서 풀라는데, 그러다 생각한데 객체를 만들어서 접근하는 방식이다..
  • objComletion라는 객체를 하나 생성하고
  • 반복분으로 objComletion.사람이름 으로 초기화한다
  • 초기화할때 멤버가 없으면 1로 초기화하고 이미 존재하면 ++해서 동명이인 처리를 했다
  • participant(참가자) 배열로 반목문을 돌면서 사람이름으로 다이렉트로 접근하니까 효율성이 엄청 좋아졌다
  • 멤버가 없거나, 0일경우 완주하지 못한 선수를 잡아낼 수 있다

잡담

  • 이 문제 풀면서 겉멋 코드에 맛들려서 안쓰던 화살표 함수도 쓰고…
  • 변수명 &, _ 이런거도 써봤다..ㅋㅋ
  • 효율성 획기적으로 줄여서 기분이 좋았다
Author

chinsung

Posted on

2020-09-18

Updated on

2021-08-04

Licensed under

댓글