완주하지 못한 선수

이건선·2023년 2월 16일

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

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

function solution(participant, completion) {
    var answer = '';
    let key = new Map()

    for(let i = 0; i < completion.length; i++){
        if(!key.has(completion[i])){
            //  값이 없을때
            key.set(completion[i], 1)
            }
        else{
            // 값이 있을때
            key.set(completion[i], key.get(completion[i]) + 1)
        }
    }
    // key ={ 'stanko' => 1, 'ana' => 1, 'mislav' => 0 }
    for(let i = 0; i < participant.length; i++){
        if(!key.has(participant[i])){
            return participant[i]
        } else {
            let count = key.get(participant[i])
            if (count == 0){
                return participant[i]
            } else {
                key.set(participant[i], count-1)
            }
        }
    }
}

// let participant = ["mislav", "stanko", "mislav", "ana"]
// let completion = ["stanko", "ana", "mislav"]

처음 코드를 작성해서 문제를 풀었으나 시간유효성검사에 부적합해서 다시 코드를 작성해야했다. 시간유효성 검사에 적합하기 위해서 객체와 for문을 이용 해야한다는 것을 배웠고 따라서 객체를 잘 다뤄야한다는 사실을 알았다.

completion는 완주한 사람 목록이므로 completion을 이용해서 객체를 생성하고 이 객체를 participant for문으로 조작해서 값을 찾아보자, 값을 찾는 방법은 객체의 value값이 0이 될 때 그 키값을 반환하는 것이다.

우선 첫번째 for문은 new Map() 함수를 이용해서 객체를 만들어야한다. if(!key.has(completion[i])) 이용해서 값이 없을때를 true로 빠지게 하고 값이 있을때를 false로 분기한다. 만약 키값이 존재하지 않는다면 true문으로 participant[i]의 요소를 초기값으로 만들어준다. 그리고 키값이 존재한다면 value에 +1을 넣어준다.

두번째 for문을 이용해서 key 객체안에 participant[i]의 요소를 찾는다. 만약 존재하지 않는 key라면 그 key를 ture값으로 바로 반환해 주고, key가 존재한다면 key.set(participant[i], count-1)을 시행한다. 여기서 중요한 점은 participant은 중복된 값이 있어서 두 번 실행 되기 때문에 for문을 시행했을때 바로 0이 된다는 사실이다.

예를 들어서

첫번째에 participant배열에 mislav가 있고 세번째에 mislav에도 존재한다고 가정한다면 value값이
[1,1,1,1] 이
[0,0,0,1] 첫번째 for문에서 0을 만들었고 세번째에서 객체에 전달된 value값이 이미 0이었기 때문에 0을 받고 key를 리턴 하는 것이다.

profile
멋지게 기록하자

0개의 댓글