알고리즘-2021/03/26

sanghun Lee·2021년 3월 26일
0

알고리즘

목록 보기
2/52
post-thumbnail

문제 설명

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

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

제한사항

마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예
participant	completion	return
["leo", "kiki", "eden"]	["eden", "kiki"]	"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]	["josipa", "filipa", "marina", "nikola"]	"vinko"
["mislav", "stanko", "mislav", "ana"]	["stanko", "ana", "mislav"]	"mislav"

풀이

function solution(participant, completion) {
    var answer = '';
    let testMap = {};

  //객체로 mapping하기
  participant.forEach((el,index)=>{
    if(testMap[`${el}`] !== undefined){
      testMap[`${el}`] = testMap[`${el}`] + 1;
    }else{
      testMap[`${el}`] = 1;
    }
  })
 
  //중복된 것 제거
  completion.forEach((el,idx)=>{
    if(testMap[`${el}`] !== undefined){
      testMap[`${el}`] = testMap[`${el}`] -1;
    }else{
      testMap[`${el}`] = testMap[`${el}`];
    }
  })

  let keys = Object.keys(testMap);
  for(let i=0; i < keys.length; i ++){
    if(Number(testMap[keys[i]]) >= 1){
      answer = keys[i];
    }
  }
      return answer;
}

처음에는 반복문을 무작정 돌려야하나 생각했다가 mapping을 시키면 좋겠다고 생각했다.
그런데 위와 같은 방식은 답변이 문자 하나로 나올 문제가 아닌 배열로 나올 문제면 더 적합하다고 생각한다

다른 풀이들을 보니 participant, completion을 그냥 sorting 메서드를 이용하여 알파벳 순서대로 순서를 맞춘 뒤 반복문을 통해서 조건문을 적용하여 동일하지 않은 것을 return 하였다.

다른 풀이

function solution2 (participant, completion) {
  //알파벳 순서대로 정렬
 participant.sort();
  completion.sort();
  //반복문 돌면서 중복되지 않는 것을 return
  for(let i in participant){
    if(participant[i] !== completion[i]) return participant[i];
  }
}

결론

문제가 요구하는 것을 잘 파악하도록 노오력 해보자 :) ...

참고

profile
알고리즘 풀이를 담은 블로그입니다.

0개의 댓글