Front-End

vsoghlv@naver.com

알고리즘 완주하지 못한 선수

문제 설명

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

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

제한사항

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

입출력 예

participant completion return
[leo, kiki, eden] [eden, kiki] leo
[marina, josipa, nikola, vinko,{" "} filipa] [josipa, filipa, marina, nikola] vinko
[mislav, stanko, mislav, ana] [stanko, ana, mislav] mislav

;

문제풀이

처음에 아래와 같이 단순히 두 배열을 비교해 찾으려 했다. 다만 처음부터 이 방법을 사용하니 애초에 받는 배열내의 객체 순서가 달라 구분하지 못하는 사태가 생겼다.

function solution(participant, completion) {
  var answer = "";
  for (let i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
      answer = participant[i];
      //console.log("ass : ", answer);
    }
  }
  return answer;
}

그래서 일단 sort() 를 사용해 인자로 받은 두 배열의 순서를 정리해준후 다시 비교했다.

function solution(participant, completion) {
  var answer = "";
  participant.sort();
  completion.sort();
  for (let i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
      answer = participant[i];
    }
  }
  return answer;
}

위의 방법은 paricipant 에 동명이인이 있는 경우 if문 안으로 두번 들어가게 되는 일이 생겨 오류가 발생한다. 일단 if문 안에서 return 을 시켜 두번들어가지 않도록 처리했는데 뭔가 찝찝하다..

function solution(participant, completion) {
  var answer = "";
  participant.sort();
  completion.sort();
  for (let i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
     return answer = participant[i];
    }
  }
}

이렇게 했을때 예제에는 없지만 동명이인의 참가자가 둘다 완주하는 경우에도 문제가 생길 수 있다. 해결방법을 조금 더 고민해봐야 할 것 같다.