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

ppyororong_0_0·2022년 1월 13일
0

프로그래머스

목록 보기
3/19

[프로그래머스 - 1단계] 체육복 문제

https://programmers.co.kr/learn/courses/30/lessons/42576

📝 문제 설명

단 한 명 빼고 모두 마라톤 완주, 완주하지 못한 선수의 이름을 return

participant배열 : 마라톤에 참여한 선수들의 이름이 담긴 배열
completion배열 : 완주한 선수들의 이름이 담긴 배열

  • 참가자 중에는 동명이인이 있을 수 있다.

💡 풀이

1. 동명이인이 있을수도 있기 때문에 각각의 이름들이 몇 명 참가했는지 확인하기

  • 빈 Map객체 생성 -> parcitipant배열을 반복문으로 돌리면서 Map객체(map)에 마라톤에 참여한 선수들의 이름을 키로 갖는 요소를 추가해준다.
  • 이 때, 요소의 값은 해당 이름이 나올 때마다 +1 해준다.
  • 중복되는 경우라면 1, 2, 3 ... 이렇게 중복된 이름 수만큼 해당 이름을 키로 갖는 요소의 값이 증가할 것이다.

2. 완주한 선수들 확인

  • 이번에는 completion배열을 반복문으로 돌리면서 completion에 있는 이름들을 키로 갖고 있는 map객체의 요소값들을 -1씩 해준다.

3. 완주하지 못한 선수 확인

  • map객체를 반복문을 돌렸을 때, 요소값이 0이 아닌 키(선수 이름)는 완주하지 못한 선수이다. (완주한 선수들은 2번 과정에서 다 빼주었음)

🖥️ 코드

(1) 처음 짠 코드

function solution(participant, completion) {
    var answer;
    for (let person of completion) {
        let idx = participant.indexOf(person);
        if (idx !== -1) {
            participant.splice(idx, 1);
        }
    }
    answer = participant[0];
    return answer;
}

이 코드는 효율성 테스트에서 시간 초과로 다 실패했다...😭


(2) 다시 짠 코드

function solution(participant, completion) {
    let map = new Map();
  
    for (let key of participant) {
        if(map.has(key)) map.set(key, map.get(key) + 1);
        else map.set(key, 1);
    }
    for (let name of completion) {
        map.set(name, map.get(name) - 1);
    }
    for (let [key, value] of map) {
        if (value !== 0) return key;
    }
}

프로그래머스 사이트 위에 보니 해시 문제라길래 해시가 뭔지 몰라서 찾아보다가 자바스크립트에서는 Map객체를 이용하는 것 같길래 Map객체에 대해 공부하고 다시 풀어보았다.
이 방법으로 풀었더니 효율성 테스트도 통과했다...😮

해시가 내부적으로 엄청 효율적으로 구성되어 있나... 반복문은 여기서 더 많이 쓴 것 같은데 효율성 테스트도 통과된 게 신기하다.
다음 할 일 : 해시가 뭔지 공부...


❗ 다른 사람 풀이

function solution(participant, completion) {
    const hash = {};

    for(let val of participant) {
      if(!hash[val]) hash[val] = 0; 
      hash[val]++;
    }

    const result = completion.forEach(val => hash[val]--);

    for(let key in hash) if(hash[key]) return key;
}

아....?? 그냥 객체로도 간단히 구현할 수 있었네...??😦🤣🤣

profile
안녕하세요!

0개의 댓글