[프로그래머스] 완주하지 못한 선수 in JavaScript

hyocho·2022년 6월 26일
0

코딩테스트

목록 보기
30/45

updated 11.07.2022

✅문제

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

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

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

🔑문제 이해

길이가 더 짧은 completion을 반복문 돌리면서 participant와 비교하면서 중복된 것을 splice로 제거해나가기. 완주하지 못한 선수의 이름을 return할 수 있다.


✍문제 풀이

1. 처음에 썼던 코드

function solution(participant, completion) {
    for(let i = 0; i < participant.length; i++){
        for(let j = 0; j < completion.length; j++){
            if(participant[i] == completion[j])
            participant.splice([i],1);
        }
    }
    return participant;
}

  • 문제점 1 동명이인이 참가한 경우 두 번 모두 지워지게 됨.
  • 문제점 2 바로바로 지우게 될 경우 length가 변하게 되므로 앞 과정에서 지우게 되면 participate의 끝까지 돌지 못하는 문제 발생.

2.두번째 쓴 코드

function solution(participant, completion) {
    var sum = participant.concat(completion);
    for(let i = 0; i < sum.length; i++){
        for(let j = 1; j <sum.length; j++)
        if(sum.indexOf(i) == sum.indexOf(j)){
           sum = sum.slice([i],1);
        }
    }
    return sum.toString();
}


concat메서드로 두 배열을 합친 후 같은 문자가 있는지 돌아가면서 찾는 방법.
아니 두번째 테스트 케이스 왜 안되는지 정말 모르겠어서 한참을 들여다본 코드😢


✔️참고할 좋은 코드

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

너무 어이없이 간단하다😣


해싱 풀이방법

function solution(participant, completion) {
  let myMap = new Map();
  for (let x of participant) {
    myMap.set(x, (myMap.get(x) || 0) + 1);
  }
  for (let x of completion) {
    myMap.set(x, (myMap.get(x) || 0) - 1);
  }
  for (let [k, v] of myMap) {
    if (v === 1) {
      return k;
    }
  }
}

알고리즘 수업시간에 배운 해싱 방법을 사용한 풀이
효율성에서 훨씬 개선되었다.


문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42576
참고한 사이트 :
1. https://im-developer.tistory.com/103
2. https://all-dev-kang.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EB%B9%84%EA%B5%90%ED%95%98%EB%8A%94-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-%ED%98%95%EB%8B%98%EC%9D%98-%EC%86%94%EB%A3%A8%EC%85%98
3. https://cattaku.tistory.com/34

profile
기록하는 습관을 기르고 있습니다.

0개의 댓글