STUDY/Algorithm

[프로그래머스] 고득점KIT - 완주하지 못한 선수

능히버섯와나 2023. 6. 16. 22:13

🔬 문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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"
 ["marina", "josipa", "nikola", "vinko",
"filipa"]
["stanko", "ana", "mislav"]  "mislav"

 

 

 

 

 

✍️ 풀이

function solution(participant, completion) {
  const sortPart = participant.sort();
  const sortComple = completion.sort();

  for (let i = 0; sortPart.length; i++) {
    if (sortPart[i] !== sortComple[i]) {
      return sortPart[i];
    }
  }
}
두 배열을 정렬한 뒤 for문을 이용해 서로 비교하며 서로 일치하지 않는 이름이 나올 때 까지 순회한다.

 

function solution(participant, completion) {
  const map = new Map();

  // participant 배열을 순회하며 이름을 키, 출현 횟수를 값으로 하는 Map 생성
  for (let name of participant) {
    map.set(name, (map.get(name) || 0) + 1);
  }
  // completion 배열을 순회하며 해당 이름의 출현 횟수를 1 감소시킴
  for (let name of completion) {
    map.set(name, map.get(name) - 1);
  }

  // Map을 순회하며 출현 횟수가 양수인 첫 번째 이름 반환
  for (let [key, value] of map) {
    if (value > 0) {
      return key;
    }
  }
}
또 다른 풀이. map에 이름과 출현횟수를 set한 뒤, 출현 횟수를 1씩 감소하여 완주하지 못한 선수를 찾아낸다.

 

function solution(participant, completion) {
  const map = new Map();

  // 참가자의 이름과 출연회수를 맵에 저장
  for (let i = 0; i < participant.length; i++) {
    let a = participant[i],
      b = completion[i];

    map.set(a, (map.get(a) || 0) + 1);
    map.set(b, (map.get(b) || 0) - 1);
  }

  // 출연회수가 0보다 큰 참가자를 찾아 반환
  for (let [k, v] of map) {
    if (v > 0) return k;
  }

  return "nothing";
}
좀 더 간결해진 표현방법. new Set()을 이용하여 중복을 걸러낸 뒤, Math.min()을 활용하여
몬스터의 수와 몬스터 종류의 수 중 작은 값을 반환하도록 했다.

 

// 매개변수를 _,$처리하여 경량화한 독특한 풀이
var solution = (_, $) =>
  _.find(
    (_) => !$[_]--,
    $.map((_) => ($[_] = ($[_] | 0) + 1))
  );



// 매개변수를 복원한 모습. completion배열 내 이름을 키, 출연회수를 값으로 등록한 객체와 participant의 이름을 비교하여
// 중복되지 않는 이름을 찾는 방법
var solution = (participant, completion) =>
  participant.find(
    (name) => !completion[name]--,
    completion.map((name) => (completion[name] = (completion[name] | 0) + 1))
  );
map을 이용하여 completion의 이름과 출연횟수를 객체로 등록한 뒤, find를 통해 participant에 없는 이름을 찾는 방법이다.

 

 

 

 

 

출처: https://programmers.co.kr/