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/