# [해시][Lv1] 완주하지 못한 선수 - 자바스크립트

# 프로그래머스 문제

https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript (opens new window)

# 시도 1.

해시라는 걸 고려 안하고 그냥 테스트 케이스를 통과하기 위해 작성한 코드.

  • indexof 함수로 completion 배열에 참가자가 있는지 확인함. 없으면 -1 리턴
  • some 은 조건이 true가 되면 중지되기때문에 indexof 결과값이 -1이 되면 중지 되도록 사용
  • splice 제약조건 중 동명이인을 거르기위함. 한번 검사한 이름은 삭제한다.

결과는 ✨효율성 대실패!✨ 애초에 자료구조를 공부하기 위함이었으니 해시를 찾아보고, 개념을 잡은 후 다시 시도했다.

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

    participant.some(function(v){
        let targetIndex = completion.indexOf(v);

        if(targetIndex === -1) answer = v;
        else completion.splice(targetIndex, 1);

        return targetIndex === -1;
    })    
    
    return answer;
}
정확성  테스트
테스트 1통과 (0.09ms, 30.1MB)
테스트 2통과 (0.08ms, 30MB)
테스트 3통과 (0.57ms, 30.1MB)
테스트 4통과 (0.79ms, 30MB)
테스트 5통과 (0.84ms, 30.2MB)
효율성  테스트
테스트 1통과 (52.70ms, 41.5MB)
테스트 2실패 (시간 초과)
테스트 3실패 (시간 초과)
테스트 4실패 (시간 초과)
테스트 5실패 (시간 초과)

# 시도 2.

사실.. 해시라는 걸 여기서 접목하거나 그러진 않은 것 같다.

정렬이 생각났고, 정렬하면 중복이름이 있어도 순차적으로 비교만하면 될것같았다.

또한 foreach.. map등보다 기본 for문이 가장 효율이 좋으니 for문또한 기본으로 작성했더니 통과함

function solution(participant, completion) {
    var answer = '';
    
    participant.sort();
    completion.sort();
    
    for(var i=0; i<participant.length; i++){
        if(participant[i] !== completion[i]){
            answer = participant[i];
            break;
        }
    }
    
    return answer;
}
정확성  테스트
테스트 1통과 (0.06ms, 29.9MB)
테스트 2통과 (0.07ms, 30.2MB)
테스트 3통과 (0.29ms, 30.3MB)
테스트 4통과 (0.62ms, 30.2MB)
테스트 5통과 (0.56ms, 30.4MB)
효율성  테스트
테스트 1통과 (46.25ms, 41.5MB)
테스트 2통과 (71.41ms, 48MB)
테스트 3통과 (108.16ms, 52MB)
테스트 4통과 (100.90ms, 55.4MB)
테스트 5통과 (100.35ms, 53.5MB)

# map을 사용한 방법

해시를 공부하고 map을 써서 하고싶었는데 다른 방법이 생각나서 못했음.. 이렇게 푸신 분이 계시나 찾아봤는데 이코드 (opens new window)을 발견했다. map을 알고도 어떻게 써야할지 감을 못잡았는데... 이런 아이디어가 있구나 배웠다.

# 풀이 방법

  1. 마라톤 참가자들의 이름을 key로 하고 value는 그 key를 가진 참가자의 명수로 하는 hashMap을 만든다.
  2. 완주자 배열에서 이름을 하나씩 꺼내 hashMap에서 같은 key의 value를 -1한다.
  3. 결국 completion의 길이는 participant의 길이보다 1 작음으로 0이 아닌 key가 완주하지 못한 참가자이다.
function solution(participant, completion) {
    const hashMap = new Map();
    let answer = '';
    
    // 마라톤 참가자들의 이름을 key로 하고 value는 그 key를 가진 참가자의 명수로 하는 hashMap을 만든다.
    participant.forEach( p => {
        let isExist = hashMap.get(p);
        if(isExist) hashMap.set(p, isExist + 1)
        else hashMap.set(p, 1)
    })
    
    //완주자 배열에서 이름을 하나씩 꺼내 hashMap에서 같은 key의 value를 -1한다.
    completion.forEach( p => {
        hashMap.set(p, hashMap.get(p) -1)
    })
    
    // 결국 completion의 길이는 participant의 길이보다 1 작음으로 0이 아닌 key가 완주하지 못한 참가자이다.
    hashMap.forEach((i, v) => {
        if(i!==0){
            answer = v; 
            return;
        }
    })
    return answer;
}
Last Updated: 8/11/2022, 5:17:02 AM