[Programmers] 완주하지 못한 선수 - JS

devMag 개발 블로그·2022년 1월 17일

프로그래머스 문제 링크

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예시

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.




나의 풀이

function solution(participant, completion) {
    participant.sort();
    completion.sort();

    for(let i = 0; i < participant.length; i++){
        if(participant[i] !== completion[i]){
            return participant[i];
        }
    }
}
  1. 참가자와 완주자를 비교해서 참가자에 남아있는 선수 이름을 반환하면 된다.
  2. 제한사항에서 봤듯이 완주하지 못한 사람은 딱 한 명만 나올 수 있다.
  3. 두 배열을 비교할 때 .sort() 를 이용해서 정렬하고 비교하면 중간에 어느 인덱스에선다 서로 다른 값을 갖고있는 지점이 만나게 된다.
  4. 그 부분의 참가자를 반환하면 그게 정답 이라고 생각했다.

다른 풀이 1

function solution(participant, completion) {
    participant.sort();
    completion.sort();

    for(let i in participant) {
        if(participant[i] !== completion[i]) return participant[i];
    }
}

동일한 방식으로 풀었는데 몇 가지 주의할 점이 풀이 댓글에 있어서 퍼왔다.

for ... in은 성능을 하락시킨다는 의미보다는 객체 내의 프로퍼티 속성 중 enumerable: true인 모든 프로퍼티를 순회하여 검색하는 용도이기 때문에 적합하지 않습니다. 최근의 그린 브라우저는 배열에 대해 for ... in을 사용해도 오류가 나지 않지만, Old IE의 경우에는 배열 인덱스 외에 검출되는 프로퍼티가 있기 때문에 undefined 와 같은 오류가 발생합니다. 따라서, 배열에 대해서는 for ... in 구문 보다는 for를 사용하거나 ES6의 forEach 함수를 사용하는 것을 권장합니다. - Bongsu Kang

또한 MDN의 페이지에도 경고문구가 나온다.
Note: for...in은 인덱스의 순서가 중요한 Array에서 반복을 위해 사용할 수 없습니다.

그냥 풀기만 급급했는데 메소드나 문법에 따라 그 쓰임새가 있었다.

다른 풀이 2

이번에는 풀긴 풀었어도 출제자의 의도대로 푼 느낌이 강하게 들어서 다른 풀이도 또한 들고와봤다.
또다시 나타난 .reduce()와 본적은 있지만 써본적은 없는 .find(), 그리고 arrow function이 보인다.
솔직히 아직 해석하면서 공부중이라서 덧붙일게 없다..
며칠내로 아윌비백..

function solution(participant, completion) {
    var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
    return participant.find(t=> {
        if(dic[t])
            dic[t] = dic[t]-1;
        else 
            return true;
    });
}
profile
최근 공부 내용 정리 Notion Link : https://western-hub-b8a.notion.site/Study-5f096d07f23b4676a294b2a2c62151b7

0개의 댓글