오늘 뭐했냐/기억하면 좋을 문제들

객체 구조를 활용한 배열 빼기

스스로에게 2023. 6. 16. 21:45

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

  1. 마라톤 선수들 이름 에서 완주한 사람들 이름 빼면 되겠네 => 중복 이름이 있다 
  2. 같은 이름 한 번씩 바꿔줘? 하나씩 날리자 
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