(1) - 완주하지 못한 선수
문제링크:
https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript
[문제 설명]
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
[제한사항]
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
생각의 흐름
- participant배열과 completion배열을 비교하고 겹치지않는 하나의 요소를 추출(filter?)
- 남은 하나와 동일한 이름이 있는 지 중복체크(reducer로 조건에 맞는 새 객체배열 생성 후 비교?)
- 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;
}
}
- Object속성을 사용하기 위해 빈객체 생성
- participant를 [ for...of ] 를 이용해서 배열 내 각 요소를 Object의 변수로 지정하고 같은 변수가 있을 시 +1을 통해서 갯수를 중복갯수를 할 수 있도록 함
- 완료자 배열인 completion를 동일하게 [ for ... of ] 를 이용해서 object에 저장해둔 중복갯수가 포함된 곳에서 -1를 해서 완료자를 빼줌.
- 최종적으로 남은 Object 내의 value가 1인것을 반환
Author And Source
이 문제에 관하여((1) - 완주하지 못한 선수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gaheekim610/코딩테스트1-완주하지-못한-선수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)