티스토리 뷰

반응형

 

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

 

문제는 위 링크에서 볼 수 있다. 문제에 대한 해설보다는 기억하고 싶은 개념, 사고, 문법을 기록하는 글이다. 

답안은 맨 아래에 표기해 두었다.

 

이 문제의 난이도는 쉬운편이었지만, 카테고리에 맞게 해시를 이용해 푸는 방법도 가져왔다. 

프로그래머스 문제를 풀면 사람들이 어떻게 풀었는지 볼 수 있는데 진짜 천재들이 많은듯하다..

 


 

답안 1. find() 메서드로 찾는다.

find() 또한 ES6에 도입된 메서드이다. 자신을 호출한 배열의 요소를 순화하면서 인수로 전달된 콜백함수를 호출하여 반환값이 true인 첫 번째 요소를 반환한다. true인 요소가 존재하지 않는다면 undefined를 반환한다. 

 

  let answer = participant.find((v, i) => v !== completion[i]);

 

find() 메서드는 주어진 판별 함수를 만족하는(true) 첫번째 요소를 반환한다고 했다. 

나중에 답안 2에서 볼 해시를 이용한 풀이법에서 find()를 쓰는데, 문제에서 완주하지 못한 사람은 단 한명이라는 조건이 있었으므로 답안 2에서는 최종적으로  find()의 속성을 이용하여 답을 찾는다.

 

 

답안2. find() 메서드로 결과 값이 true 인 key의 value를 반환한다. 

function solution(participant, completion) {
  let dic = completion.reduce(
    (dic, key) => ((dic[key] = dic[key] ? dic[key] + 1 : 1), dic),
    {}
  );
  // ind메서드는주어진 판별 함수를 만족하는 첫 번째 요소의 값을 반환
  return participant.find((key) => {
    if (dic[key]) dic[key] = dic[key] - 1;
    else return true;
  });
}

해시를 이용한 풀이법이다. 카테고리에 맞는 모범 답안이 아닐까 싶다. key: value를 지정하는 해시를 이용하는것은 나도 익숙치 않아서 이 문제는 풀이를 좀 해보고자 한다. 

 

  let dic = completion.reduce(
    (dic, key) => ((dic[key] = dic[key] ? dic[key] + 1 : 1), dic),
    {}
  );

completion을 reduce()를 이용하여 completion의 value를 key값으로 만들어준다. => dic[key]

같은 이름이 있다면 value에 1을 더하고, 그렇지 않으면 1을 할당해준다. 완주자 이름의 개수라고 보면된다. 

 

끝에 ,dic 을 붙이는 이유는 초기값을 넣어주는 자리로 find()를 통해 dic = {} 에 key, value가 누적되게 된다.

 

completion= ["eden", "kiki"] 라면

dic = { eden: 1, kiki: 1 } 이 된다.

 

  return participant.find((key) => {
    if (dic[key]) dic[key] = dic[key] - 1;
    else return true;
  });

 

그리고 참가자들 배열 participant.find()를 통해 dic의 key값 (이름)을 체크한다.  존재하면 value값에 -1를 해주고 

아니라면 완주자 목록에 없는 이름이기 때문에 true를 통해 완주하지 못한 사람을 return한다.

여기서 'true'를 리턴했을 어떻게 'leo'가 return이 되는건지 헷갈렸는데 이는 find()메서드의 속성을 이용했기 때문이었다.

 

 


 

구현 능력 

카테고리가 해시여서 해시를 이용해서 풀어보려 했으나, 하지 못했다. 

결국 다른 분 코드를 봤는데 찾아보니 배열의 길이가 긴 경우에는 sort()로 재배열 시키는 것보다는 key값을 통해 해결하는 해시를 이용한 풀이가 더 낫다고 한다. 

 

 


 

답안 

 

 

답안 1. 제출 답안 

function solution(participant, completion) {
  participant.sort();
  completion.sort();

  for (let i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
      return participant[i];
    }
  }

  let answer = participant.find((v, i) => v !== completion[i]);
  return answer;
}

 

답안 2. 해시를 이용한 답안

function solution(participant, completion) {
  let dic = completion.reduce(
    (dic, key) => ((dic[key] = dic[key] ? dic[key] + 1 : 1), dic),
    {}
  );
  console.log(dic);
  // find메서드는주어진 판별 함수를 만족하는 첫 번째 요소의 값을 반환
  return participant.find((key) => {
    if (dic[key]) dic[key] = dic[key] - 1;
    else return true;
  });
}

 

 

반응형