수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
- 마라톤 선수들 이름 에서 완주한 사람들 이름 빼면 되겠네 => 중복 이름이 있다
- 같은 이름 한 번씩 바꿔줘? 하나씩 날리자
function solution(participant, completion) {
for (i = 0; i < completion.length; i++) {
for (j = 0; j < participant.length; j++) {
if (participant[j] === completion[i]) {
participant[j] = null
break;
}
}
}
return participant
}
처음엔 다 돌면서 null로 비웠다
completion.forEach(v=>{
participant.splice(participant.indexOf(v),1)
}
그 다음에 중간에 값을 날려서 배열의 크기 자체를 줄이면 어떨까
둘 다 시간초과 작동에는 문제 없지만 효율성이 많이 떨어진다
그래서 다른 사람의 답을 봤다 아직은 보고 뜯어보면 이해는 하지만 내가 막상 다른 상황에서 쓰라고 하면 힘들 것 같다 하지만 일단 계속 경험하다 보면 익숙해지겠지 생각하며 이해한 내용을 정리한다
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';
}
.set(키,값)으로 a 에서는 처음 키를 추가하면 0+1 이걸 b에서 -1 같은 순서는 아니라도 대입하면 이런 식으로 key에 참가자 이름이 값이 카운터가 들어가 완주자와 동일한 이름의 중복 수만큼 0으로 맞춰진다 이렇게 반복이 끝나면 완주자를 못한 한 명만 값이 1인 키가 되어 조건식으로 키를 반환하면 된다
여기서 내가 사용한 방법과 시간차이가 나는 이유는 뭘까 나는 이중 반복문으로 i가 10이면 j는9번 즉 i*j를 해서 90번을 반복하고 이게 숫자가 올라가면 그 차이는 더 커진다 그리고 수정한 것은 조금 나아지긴 했지만 반복을 정말 많이 한다
그런데 위 코드는 반복을 두 번만 한다
그래서 시간 차이가 많이 발생했다
function solution(participant, completion) {
var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
return participant.find(t=> { // 객체에 Map사용 예처럼 마찬가지로 이름을 키로 숫자를 카운터를 늘려간다
if(dic[t])
dic[t] = dic[t]-1; // 하나씩 0으로 바꿔준다
else
return true; // 0이 되었는데 다시 호출되면 이곳으로
// find()의 콜백이 강제로 true
// -> 그 때의 요소가 첫 번째 true값이면 그 값을 반환
});
}
retrun ture를 이용해 콜백에서 true를 반환하면서 콜백을 사용하는 메서드에 활용할 수도 있겠다라는 생각을 하게 되었으며 Map자료 구조와 reduce() 활용법은 전에도 한 번 봤었는데 아직 익숙하지 않아 사용할 생각도 못하고 있었다 지금이야 이렇게 매번 잊고 있다가 다시 하지만 경험이 쌓이면 능숙하게 사용할 수 있을 것이다
'오늘 뭐했냐 > 기억하면 좋을 문제들' 카테고리의 다른 글
| 정규 표현식 연계 (0) | 2023.06.21 |
|---|---|
| Map활용해보기 (0) | 2023.06.17 |
| Set 자료구조로 문자열 전달 (0) | 2023.06.15 |
| for문에서 특정 숫자로 반복이 필요할 때 (0) | 2023.06.15 |
| indexOf() (0) | 2023.06.15 |