https://programmers.co.kr/learn/courses/30/lessons/42576
단 한 명 빼고 모두 마라톤 완주, 완주하지 못한 선수의 이름을 return
participant배열 : 마라톤에 참여한 선수들의 이름이 담긴 배열
completion배열 : 완주한 선수들의 이름이 담긴 배열
- 참가자 중에는 동명이인이 있을 수 있다.
1. 동명이인이 있을수도 있기 때문에 각각의 이름들이 몇 명 참가했는지 확인하기
2. 완주한 선수들 확인
3. 완주하지 못한 선수 확인
(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;
}
아....?? 그냥 객체로도 간단히 구현할 수 있었네...??😦🤣🤣