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

Derhon·2023년 1월 11일
0

문제풀이

목록 보기
1/13
post-thumbnail

프로그래머스 - 완주하지 못한 선수

나의 답

function solution(participant, completion) {
    let answer = '';
    
    participant.forEach((member) => {
        if(!completion.includes(member)){
            answer = member;
        }else{
            completion.splice(completion.indexOf(member), 1);
        }
    });
    
    return answer;
}

이렇게 풀면, 정확성은 모두 통과하지만 효율성은 모두 탈락한다(...)
카테고리가 Hash 이니 Hash를 복기하며 풀어본다.

진짜 답

해시 안쓰기

function solution(participant, completion) {
    let answer = '';
    
    const part = participant.sort();
    const comp = completion.sort();
    
    for(let i = 0; i < part.length; i++){
        if(part[i] !== comp[i]){
            answer = part[i];
            break;
        }
    }
    
    return answer;
}

너무 어이없게도, sort()를 통해 정렬한 후 반복문을 돌려서 같은 인덱스에 서로 다른 값이 나오면 해당 값이 정답이 된다.
어이없긴 하지만, 올바른 로직이긴하다.

해시쓰기

function solution(participant, completion) {
    let answer = '';
    
    //map 생성    
    const runnerMap = new Map();
    
    //participant 돌면서 map에 넣기
    participant.forEach((member) => {
        //runnerMap에 등록된 동명이인이 있다면, value를 +1
        //없다면 등록
        if(runnerMap.get(member)) runnerMap.set(member, runnerMap.get(member) + 1);
        else runnerMap.set(member, 1);
    });
    
    //완주자는 runnerMap에서 제거
    completion.forEach((comp) => {
        //완주자 명단의 이름이 runnerMap에 있다면, value를 1씩 낮춰줌
        if(runnerMap.get(comp)) runnerMap.set(comp, runnerMap.get(comp) - 1);
    })
    
    //participant 돌면서 0명보다 많이 남아있는 인원 찾아내기
    participant.forEach((member) => {
        if(runnerMap.get(member) > 0) answer = member;
    })
    
    return answer;
}

코드에 대한 상세 풀이는 주석으로 작성해놓았다.
Map을 이용하여 해시를 구현하였고, 풀이하였다.

function solution(participant, completion) {
    let answer = '';
  
    let runnerObj = [];
    
    participant.forEach((member) => {
        runnerObj[member] = runnerObj[member] ? runnerObj[member] + 1 : 1;
    })
    
    completion.forEach((comp) => {
        runnerObj[comp] = runnerObj[comp] - 1 ;
    })
    
    for(let name in runnerObj){
        if(runnerObj[name] > 0){
            answer = name;
            break;
        }
    }
    
    return answer;
}

이번엔 object를 기반으로 해시를 적용해보았다.
로직 자체는 Map을 사용한 것과 동일하다.

profile
🧑‍🚀 이사했어요 ⮕ https://99uulog.tistory.com/

0개의 댓글