(1) - 완주하지 못한 선수

문제링크:
https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript

[문제 설명]
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
[제한사항]
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

생각의 흐름

  1. participant배열과 completion배열을 비교하고 겹치지않는 하나의 요소를 추출(filter?)
  2. 남은 하나와 동일한 이름이 있는 지 중복체크(reducer로 조건에 맞는 새 객체배열 생성 후 비교?)
  3. part배열 내 중복갯수 - com배열 내 갯수 중 갯수가 1이상 인 것

1번째 시도

function solution(participant, completion) {
    let answer = '';
    answer = participant.filter((itm)=>!completion.includes(itm))
    return answer[0];
}
  • filter로 없는 원소를 찾아내려고 했지만
    중복값이 들어가있는 마지막 테스트 예제는 통과하지 못했다.......... 예외 처리 실패함.

2번째 시도

  • reduce를 이용해서 각 배열 내 변수 중복숫자를 count를 해주어 새로운 배열로 반환하여 진행하다가 객체로 갯수체크 로직하는 훨씬 효율적인 방법을 찾게됨.

3번째 시도

for문의 종류와 차이점
: for ... in & for 는 index 반환
: for ...of & forEach는 값 반환

1. let countObj = {}; 
2. for (let p of participant) {
    countObj[p] = countObj[p] ? countObj[p] + 1 : 1;
  } // 

3. for (let c of completion) {
    countObj[c] -= 1;
  }

4. for (let key in countObj) {
    if (countObj[key] === 1) {
      return key;
    }
  }
  1. Object속성을 사용하기 위해 빈객체 생성
  2. participant를 [ for...of ] 를 이용해서 배열 내 각 요소를 Object의 변수로 지정하고 같은 변수가 있을 시 +1을 통해서 갯수를 중복갯수를 할 수 있도록 함
  3. 완료자 배열인 completion를 동일하게 [ for ... of ] 를 이용해서 object에 저장해둔 중복갯수가 포함된 곳에서 -1를 해서 완료자를 빼줌.
  4. 최종적으로 남은 Object 내의 value가 1인것을 반환

좋은 웹페이지 즐겨찾기