수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
| 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" |
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
이번 문제는 수영님의 추천 문제였다.
문제에 해시 라는 키워드가 있는 걸 보면 요구하는 바가 있는 것 같은데 알고리즘을 모름 이슈로 그냥 논리만 정리해서 풀어보기로 했다.
처음에는 sort 를 사용해서 정렬한 다음 배열끼리 비교하면서 일치하는 값을 없애는 식으로 풀어보면 어떨까 고민했는데, 중복된 이름이 있을 수 있다고 해서 객체를 이용하는 방법으로 풀기로 했다.
바로 코드를 짜기는 어려운 문제라고 느껴져서 조건을 정리한 다음 한 줄씩 구현하는 방법으로 풀어봤는데… 스읍… 통과를 하긴 했는데
정확성: 58.3
효율성: 41.7
합계: 100.0 / 100.0
정확성 이것 뭐예요…? 이건 다음에 다시 풀어봐야 할듯
// [ 조건 ]
// 완주를 못한 선수가 몇 명인지 X, 누구인지 O => 배열의 '값'을 리턴
// 선수 이름은 중복될 수 있다
// 1. 참여 명단 participant를 객체로 만든다
// => 중복값이 있으면 해당 키의 값을 + 1
// 2. 만들어진 객체의 키와 완주자 명단 completion의 값을 비교
// 2-1. 일치하는 키가 있으면 배열에서 제거하고 객체의 값을 -1
// 3. 1 객체의 프로퍼티 중 값이 0이 아닌 키를 answer로 반환
function solution(participant, completion) {
const participantObj = {};
for (let i = 0; i < participant.length; i++) {
participantObj[participant[i]] = participantObj[participant[i]] ? participantObj[participant[i]] + 1 : 1;
}
for (let i = 0; i < completion.length; i++) {
participantObj[completion[i]] = participantObj[completion[i]] - 1;
}
for (let key in participantObj) {
if (participantObj[key] > 0) {
return key;
}
}
}
console.log(solution(["leo", "kiki", "eden"], ["eden", "kiki"])); // "leo"
console.log(solution(
["marina", "josipa", "nikola", "vinko", "filipa"],
["josipa", "filipa", "marina", "nikola"]
)); // "vinko"
console.log(solution(["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"])); // "mislav"
이게 처음에 내가 풀려고 했던 방식과 비슷한 것 풀이인 것 같다.
문제에서 완주를 못 한 사람은 단 한 명이라고 명시했기 때문에 접근 가능한 방법이다.
굉장히 간단하고 깔끔해보임…!
const solution = (p, c) => {
p.sort()
c.sort()
while (p.length) {
let pp = p.pop()
if (pp !== c.pop()) return pp
}
}
정규표현식을 사용한 버전
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))