본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level1] 완주하지 못한 선수

by Benjamin_Choi 2021. 5. 13.

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

 

문제 설명

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

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

제한사항

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

  • 첫 번째 풀이
function solution(participant, completion) {
    var answer = '';
    participant.some((name) => {
        const index = completion.indexOf(name);
        if (index > -1) {
            completion.splice(index, 1);
            return false;
        } else {
            answer = name;
            return true;
        }
    });
    return answer;
}

그냥 기존 participant 한 바퀴 돌려서 competion 배열에서 해당되는거 하나씩 빼주면서 확인하는 방식으로 갔더니 splice 함수에서 시간을 많이 뺏겼는지 효율성에서 전부 퇴짜먹었다. 배열을 해시로 바꿔서 확인하는 방식으로 짜보자.


  • 두 번째 풀이
function solution(participant, completion) {
    var answer = '';
    const cObj = completion.reduce((obj, name) => {
        if (!obj[name]) {
            obj[name] = 1;
        } else {
            obj[name]++;
        }
        return obj;
    }, {});
   
    participant.some((name) => {
        if (!cObj[name]) {
            answer = name;
            return true;
        } else {
            cObj[name]--;
            return false;
        }
    });
    return answer;
}

completion 배열을 name을 key, 갯수를 value 로 갖는 객체로 바꿔주고, 해당 객체를 확인해서 participant를 확인하는 방식을 바꿔줘서 통과했다. 따로 배열을 삭제하는 로직이(splice) 빠지니까 코드 길이가 길어져도 오히려 효율성이 높아지는 것을 확인할 수 있었다. 

댓글