🙌문제설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
☑️나의 풀이
처음엔 forEach로 순회하면서 문제를 푸는 방법을 생각했는데, 실패한 코드이다
function solution(participant, completion) {
var arr = [];
participant.forEach((key)=>{
if(participant(key)===completion(key)) participant.pop(key);
else arr.push(participant(key));
})
return arr.split('');
}
이렇게 작성할 경우? 1. 순서가 맞지 않을때 비교 불가능, 2. forEach 잘못된 작성법으로 틀렸다.
1의 이유로 정렬시키고, 잘쓰는 문법 for문으로 풀어야겠다고 생각했다.
2의 이유는 정리하는 글을 작성해보아야겠다. 근데 찾아보니 성능에 불합격 나올수도 있다고 한다.
function solution(participant, completion) {
participant.sort();
completion.sort();
for(let i=0; i<participant.length; i++){
if(participant[i] != completion[i]) return participant[i];
}
}
❓해시 풀이
해시는 Map과 object 를 말한다.
.set, .get
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
☑️배운 점
해시문제가 생각할 것이 꽤 있어서 재미있다.
그리고 자바스크립트의 메서드, 기교에 감탄을 가졌던 다른날 과 달리, 이 문제는 근본을 보여준 문제같았고,
해시를 활용한 문제풀이 실력이 부족하다는 것을 느꼈다.
다음 게시물? => forEach 사용법 정리, 해시 Map .set .get 정리
#참고
문풀 뿐만 아니라, 관련 함수 정리까지 있는 글. 감사합니다🙏