Recent Posts
Recent Comments
Link
Today
Total
01-27 18:06
관리 메뉴

채린씨의 티스토리

[Programmers] Level1 - 완주하지 못한 선수(JavaScript) 본문

코딩테스트 대비

[Programmers] Level1 - 완주하지 못한 선수(JavaScript)

채린씨 2022. 3. 22. 15:34

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"

 

입출력 예 설명

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

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

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

 

 


 

나의 첫 번째 풀이 (효율성 테스트 통과 X)

function solution(participant, completion) {
  var answer = "";
  // 완주한 모든 선수에 대하여
  for (let i = 0; i < completion.length; i++) {
    // 참가자 명단에서 해당 선수의 이름을 찾고
    let index = participant.indexOf(completion[i]);
    // 참가자 명단에서 해당 이름 삭제
    participant.splice(index, 1);
  }
  // 참가자 명단에 남아있는 선수가 완주하지 못한 선수
  answer = participant[0];
  return answer;
}

 

나의 풀이 (효율성 테스트 통과 O)

function solution(participant, completion) {
  var answer = "";

  // 두 배열을 정렬한다!
  participant.sort();
  completion.sort();

  // 앞에서부터 차례로 비교하다가 값이 다를 때 participant의 요소가 완주하지 못한 선수!!
  // if (participant[i] != completion[i] || i == participant.length - 1) 이런 식으로
  // 완주하지 못한 선수의 이름이 마지막에 있을 경우도 고려해야 하나..? 라고 생각했지만
  // 그 때는 completion[i]의 값이 undefined가 되므로 괜찮음!
  for (let i = 0; i < participant.length; i++) {
    if (participant[i] != completion[i]) {
      answer = participant[i];
      break;
    }
  }

  return answer;
}

 

좋았던 다른 사람의 풀이

해시 카테고리의 문제를 배열 정렬로 풀어서 찝찝했는데, 배열의 길이가 길면 sort 때문에 성능이 낮아질 것이라고 한다.. 아래의 풀이는 '해시'라는 카테고리에 적절한 풀이인데, participation의 요소를 map에서 찾아 그 value값에 1을 더해주고, completion의 요소를 map에서 찾아 그 value값에 1을 빼준다. 최종적으로 map에서 value값이 양수인 것을 찾으면 그 key가 완주하지 못한 선수!! 처음으로 이름이 등장하는 선수는 기존에 저장된 value값이 없으므로 0을 value값으로 할당해준 뒤 1을 더하거나 빼줘야 하고, 이전에 이름이 등장했던 선수는 기존에 저장된 value값에 1을 더하거나 빼줘야 하는데 이 두 가지 케이스를 하나의 코드로 해결한 점이 정말정말정말 인상깊다.

function solution(participant, completion) {
  const map = new Map();

  for (let i = 0; i < participant.length; i++) {
    let a = participant[i],
      b = completion[i];

    map.set(a, (map.get(a) || 0) + 1);
    map.set(b, (map.get(b) || 0) - 1);

    console.log(map);
  }

  for (let [k, v] of map) {
    if (v > 0) return k;
  }
}

 

다른 사람의 코드를 보고 이해하는 것과, 이를 내 코드에까지 적용시키는 건 정말 다른 문제다.. 다른 사람들의 풀이를 많이 접하면서 좋은 점은 흡수해서 내 코드에 녹여낼 수 있도록 해야지!

 


프로그래머스 문제들의 자바스크립트 풀이가 궁금하신가요? 아래 링크를 클릭해보세요!

https://programmers-solution-bank.netlify.app/

 

프로그래머스 해설 은행

 

programmers-solution-bank.netlify.app

 

 

 

Comments