JS algorithms - 완주하지 못한 선수

Jaa-van·2023년 4월 8일
0
post-thumbnail

문제

@수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

를 map 을 이용해 풀어보려 한다

function solution(participant, completion) {
    var answer = '';
    let myMap = new Map();
    completion.forEach((val,i)=>myMap.set(val,i))
    for (let i = 0; i< participant.length; i++) {
        if (myMap.has(participant[i])==false) return participant[i]
    }
}

forEach 문을 통해 val, i 를 map 에 set 해주는 것으로 객체로 활용해 효율성을 올려보려고 했지만, 동명이인이 있을 경우에는 틀린 값이 나왔다

Map 의 특징

이는 자료구조 Map 의 경우 같은 key 을 저장하게 될 경우 나중에 받는 값으로 저장된다는 특징 때문이다

그래서 val, i 가 아닌 i , val 을 myMap 에 set 해주는 방법을 생각했다

그러면 value 값으로 key 를 찾아야 하는데 다시 배열로 돌려서 find 메서드를 사용하는 법을 생각해보았다

function getKey(map, value) {
  return Array.from(map.keys()).find((key) => map.get(key) === value);
}

get key 함수를 사용해서 value 를 통해 key 를 찾을수는 있지만 데이터 측면에서 좋지 않을 것 같다는 생각이다

function getKey(map, value) {
  return Array.from(map.keys()).find((key) => map.get(key) === value);
}

let participant = ["leo", "kiki", "eden", "leo"];
let completion = ["leo", "kiki", "eden"];
function solution(participant, completion) {
  let answer = [];
  let myMap = new Map();
  participant.forEach((val, i) => myMap.set(i, val));
  for (let i = 0; i < completion.length; i++) {
    myMap.delete(getKey(myMap, completion[i]));
  }
  let num = myMap.entries();
  console.log(num); // [Map Entries] {[3,'leo]}
  console.log(...num); // [3,'leo']
}

solution(participant, completion);

여기서 마지막 부분에 myMap 에 하나만 남은 요소를 출력하는 것에 어려움을 겪었다
num 을 Map 요소에서 벗겨내기 위해 spread operator 를 사용하기로 했다

let num = [...myMap.entries()];
  console.log(num[0][1]); // leo

이런 말도 안되는 방식으로 'leo'를 추출하긴 했는데 좋은 방법은 아닌 것 같다

거기에 효율성 테스트에서 모두 실패가 떴다
forEach 와 for 문을 많이 돌리는 것이 패착이었다

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

결국 전체 등수를 구할 필요 없이 겹치지 않는 값 하나만 구하면 되기 때문에 sort 를 이용해 비교하는 방법으로 풀었다

결론

자료구조 Map 에 대해 공부를 할 수는 있었지만 상황에 맞는 자료구조와 방법을 이용할 수 있도록 하자

0개의 댓글

관련 채용 정보