본문 바로가기

코딩테스트

[프로그래머스] level1. 완주하지 못한 선수 (javascript)

반응형

문제

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

의식의 흐름

  1. 그냥 for문 돌려서 일일이 비교 해서 없는거 찾기
    indexOf 함수를 사용해서 for문을 돌렸다.

=> 문제점. 조건문 쓸게 너무 많아서 정확성과 효율성에서 떨어졌다.

  1. 배열을 통으로 비교할 방법이 없을까? ==> 이게 sort였음.
    => sort로 두 배열을 정렬시켜서 동일하게 만든 다음, for문 한번으로 틀린 부분을 찾는 것이였다.

다른사람의 정답

방법 1.
출처 : 참조

function solution(participant, completion) {
    participant.sort();     //참가자 배열 정렬
    completion.sort();         //완주자 배열 정렬
    for(var i=0;i<participant.length;i++){
        if(participant[i] !== completion[i]){
                            //인덱스 0부터 순차적으로 두 배열 비교
            return participant[i];
                            //비완주자가 참가자 배열에 나올 경우 출력
        }
    }
}

디테일 : return을 따로 변수 선언안하고 바로 해줄 수 있으면 해주도록 해보자.

 

 

 

방법 2.
출처 : 참조

function solution(participant, completion) {

  let reducer = participant.reduce((allNames, name) => { //MDN reduce안에 나와있는 활용법중 하나이다.
    allNames[name] = allNames[name] ? allNames[name] + 1 : 1;
    return allNames;
  }, {}); // 이렇게 되면 reducer에는 전체 참가자의 {선수이름:중복횟수}로 구성된 객체가 생성된다.

  completion.forEach((key) => { // 도착한 선수의 이름이 들어 있는 배열을 forEach를 사용,
    if (reducer[key] && reducer[key] === 1) { //reduce객체의 [key]로 넣어 확인+ 동명이인 X
      delete reducer[key];                   //도착했으니까 그 선수이름과 동명이인여부를 지워준다
    } else if (reducer[key] && reducer[key] !== 1) {//위의 조건에서 동명이인이 있는 경우
      reducer[key] = reducer[key] - 1; // 동명이인이니까 value가 2이상일테고, 그렇다면 한명 지워준다.
    }
  });

  return Object.keys(reducer)[0]; //남은 키와 밸류는 도착하지 못한 1명, 만약 여러명인경우 반복문을돌려 반환해야 할것이다.
}

 

 

방법 2-1.

function solution(participant, completion) {
    var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
    return participant.find(t=> {
        if(dic[t])
            dic[t] = dic[t]-1;
        else 
            return true;
    });
}

 

 

해시 알고리즘으로 key와 value값을 만들어서 푼 것이다.

find() : 조건에 만족하는 첫번째 값을 반환한다.

위에서 처음으로 dic[t] 값이 없을 경우 else로 빠져서 true로 조건에 만족하므로 그 t 값이 반환이 된다.

반응형