본문 바로가기
알고리즘

[프로그래머스/자바스크립트] 해시 - 완주하지 못한 선수

2021. 11. 3.

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

 

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

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

programmers.co.kr

 

첫번째 풀이

function solution(participant, completion) {
  completion.forEach((racer) => {
    var idx = participant.indexOf(racer);
    participant.splice(idx, 1);
  });
  var answer = participant[0];
  return answer;
}

시간 초과가 떠서 틀렸다.

 

두번째 풀이

function reducer(arr) {
  var result = arr.reduce((counter, racer) => {
    counter[racer] = (counter[racer] || 0) + 1;
    return counter;
  }, {});
  return result;
}

function solution(participant, completion) {
  var obj_participant = reducer(participant);
  var obj_completion = reducer(completion);

  var answer = "";
  Object.entries(obj_participant).map(
    ([participant_name, participant_count]) => {
      if (!obj_completion[participant_name]) {
        answer = participant_name;
      } else if (obj_completion[participant_name] !== participant_count) {
        answer = participant_name;
      }
    }
  );

  return answer;
}

- 객체 형태로 변환해서 key 와 value 값을 비교해줘야 할 것 같아서

reducer 함수를 따로 만든 뒤에, 그 reducer 함수로 만든 참가자 객체와 완주자 객체를 각각 비교했다.

- 다른 풀이를 볼 때마다 가장 먼저 드는 생각은 진짜 난 똥멍청인가 하는 것이다ㅋㅋ

복잡하게 생각하면 한도 끝도 없이 복잡해지는 것 같다.

왜 저렇게 단순 명료한 풀이법을 생각 못하나 싶다.

바보같이 사서 고생하는 풀이를 볼 때마다 자괴감 듦..ㅋㅋㅋ

 

세번째 풀이 (최종)

function solution(participant, completion) {
    participant.sort();
    completion.sort();
    for (var i=0; i < participant.length; i++) {
        if (participant[i] !== completion[i]){
            return participant[i]
        }
    }
}

- sort 를 생각해내지 못했다. 먼저 두 배열 모두 정렬을 해주고 나서 차례로 비교하면 불일치하는 요소를 쉽게 알 수 있었는데 말이다. 

댓글