상현에 하루하루
All 개발자의 하루

[해시] 완주하지 못한 선수

( 업데이트: )

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

[2020-05-09] 실패

현재 컴퓨터공학(CS)관련 지식이 하나도없다. 그러면 어떻게 접근할지 생각하고 기록에 남겨보려한다.

function solution(participant, completion) {
    /**
     * @type participant Array
     * @type completion Array
     */
    
    // Utile
    const numberRegExp = new RegExp('(.*[^0-9])', 'g');
    function UniqueName(data) {
        const { name, set, count = 0 } = data;
        if(!set.has(name + count)) set.add(name + count);
        else {
            let nameSlice = numberRegExp.exec(name);
            // 정규식은 내가 할당해도 null 인경우가 있다. node관련에서 문제제기 된 부분임
            // 그래서 할당될 때까지 반복
            while(nameSlice === null) {
                nameSlice = numberRegExp.exec(name);
                break;
            };
            UniqueName({name: nameSlice[0], set, count: count + 1});
        }
    }
    
    const uqCompletion = new Set();
    completion.sort().forEach(name => {
        UniqueName({name, set: uqCompletion});
    });
    const uqParticipant = new Set();
    participant.sort().forEach(name => {
        UniqueName({name, set: uqParticipant});
    });
    
    // 완주하지 못한 선수 찾기
    uqCompletion.forEach(name => {
        if (uqParticipant.has(name)) uqParticipant.delete(name);
    });
    
    // 결과 맵핑 return
    const who = uqParticipant.values().next().value;
    let result = numberRegExp.exec(who);
    while(result === null) {
        result = numberRegExp.exec(who);
        break;
    };
    return result[0];
}

배열로 받는 사람들의 이름은 중복이 될 수도 있다고 문제에 나와있다. 그래서 처음으로 생각했던게 중복을 제거하고 하고 구분하기위해서 new Set()으로 만들어서 구분하려했다. 유니크한 네임을 설정해서 저장해두고 완주한 사람과 참가자를 구분해서 목록에서 제거해나가고 마지막으로 완주목록이 모두 끝나면 참자가 1명을 반환하는 방식으로 문제를 해결하려 시도

일단 제출에서 실패했다.