본문 바로가기
코딩테스트

(JS) 프로그래머스 - 완주하지 못한 선수

by Dev_Dank 2021. 5. 25.

 

https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript 

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

function solution(participant, completion) {
    for (let j = 0; j < completion.length; j++) {
        if (participant.indexOf(completion[j] !== -1)) {
            participant.splice(participant.indexOf(completion[j]),1)
        }        
    }
    var answer = participant[0];
    return answer;
}

처음 작성한 코드는 정확성은 통과 했는데 효율성을 통과하지 못했다. 그도 그럴게 배열의 길이가 100,000인데 일일히 하나씩 대조해가면서 확인하니 최악의 경우 연산을 약99억번 (100,000 * 999,999) 해야하니 시간이 오래 걸릴만 하다. 

그래서 각 배열의 원소의 출현횟수를 객체로 저장해두고 출현횟수만 기록하여 비교하는 방식으로 코드를 써서 연산횟수를 줄였다. 이 경우 최대 40만번의 연산으로 수행이 가능하다. 

function solution(participant, completion) {
    const participantCount = {};
    
    for (let j = 0; j < participant.length; j++) {
        (participantCount[participant[j]] !== undefined) ? participantCount[participant[j]] += 1 : participantCount[participant[j]] = 1;
    }
    
    for (let i = 0; i < completion.length; i++) {
         participantCount[completion[i]] -= 1;
     } 
    
    var answer = Object.keys(participantCount).find(element => participantCount[element] === 1);
        
    return answer;
}

근데 다른사람들 풀이를 보니까 그냥 sort() 시켜서 두 문자열 사이에서 차이가 나오는 부분을 바로 리턴하는게 더 간편할거 같다. 나는 의미 없이 객체를 하나더 만든 꼴이다. 

function solution(participant, completion) {

    participant.sort();
    completion.sort();

    for(let i in participant) {
        if(participant[i] !== completion[i]) return participant[i];
    }
}

 

댓글