[JS/Programmers] 완주하지 못한 선수

정나린·2022년 3월 1일

1. 난이도: 프로그래머스 LEVEL 1

2. 문제요약: 완주하지 못한 한 명의 이름을 반환하라

3. 문제핵심: hash(map)을 사용해서 문제를 풀 수 있는가

1. map()이란?

  • map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
    (출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

  • 위의 문제에서 map()을 사용하면 좋은 점은, 각 요소에 대해 접근할 수 있다는 것이다.

  • 참여한 사람(participant)과 완주한 사람(completion)의 요소는 단 하나만 차이가 나고, 그 하나를 알기 위해서는 요소 하나 하나에 접근해야 하기 때문이다.

2. get(), set()

1) get(): map에서 특정 요소(key)의 값(value)을 읽어올 때

2) set(): map의 특정 요소(key)의 값(value)을 지정해줄 때

3. 문제 풀이

1) for문 사용하기

  • js에서 hash가 익숙지 않아서 일단 풀어야겠다는 생각에 for문을 사용해서 하나씩 비교해서 풀었던 방법이다.
function solution(participant, completion) {
    participant.sort()
    completion.sort()
    
    for(let i = 0; i< participant.length; i++){
        if(participant[i] !== completion[i]){
            return participant[i]
        }
    }
}
  • 두 배열(participant, completion)을 정렬하는 이유는 뒤에서 for문으로 인덱스순대로 비교하기 때문이다.
    정렬을 한 상태여야만 participant에만 하나 더 들어 있는 사람의 이름을 정확히 캐치할 수 있다.

  • sort() - O(n log(n))
    : 인자값으로 넘어온 함수에 따라 값을 정렬한다.
    (funtion이 없을 경우, Unicode 값으로 정렬한다.)

2) map 사용하기

function solution(participant, completion) {
    const map = new Map();
    
    participant.forEach(p =>{
        if(map.get(p)){
            map.set(p, map.get(p)+1);
        }else{
            map.set(p,1);
        }
    })
    
    completion.forEach(c =>{
        if(map.get(c)){
            map.set(c, map.get(c)-1);
        }
    })
    for(const p of participant){
        if(map.get(p) >= 1){
            return p;
        }
    }
}
  • forEach()의 break?
    : 기본적으로 forEach()는 break 기능이 없다고 한다.

  • 위의 코드에서 마지막에서만 for문을 쓴 이유도 if 조건문에 해당되는 경우 p를 반환하면서 for문의 반복을 멈춰야 하기 때문이다.

  • 대신 for of 문을 사용해서 배열의 요소들에 하나 하나 접근한다.

0개의 댓글