문제 설명
- 수많은 마라톤 선수들이 마라톤에 참여하였습니다.
- 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
- 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
- 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
단 한명이라고 엄청 강조하네요??🤔
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
동명이인 이라는 키워드 중요할 것 같다. 😗
입출력 예 설명
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에
한명은 완주하지 못했습니다.
예제 #3을 어떻게 뽑아내는지가 중요할 것으로 보인다.
그럼 어떻게 풀면 좋을까??🤔
function solution(participant, completion) {
participant.sort()
completion.sort()
for(let i = 0; i < participant.length; i++){
if(participant[i] !== completion[i]){
return participant[i]
}
}
}
생각보다 되게 간단히 풀리는 문제였다.
다만 뭔가 다른 방법이 없을까.. 하고 다른 분들의 풀이를 찾아보는데
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)
}
for(let [key, value] of map){
if(value > 0){
return key
}
}
return
}
처음 보고 무슨 소리지 했다
근데 이 코드가 가독성이 좋다는 댓글이 있어 꼭 이해하고 넘어가야겠다 싶었고
자바스크립트에서 자주 쓰는 Hash Table 개념이 들어가있다고 했다.
그래서 map 함수와 Hash Table에 대해 공부해보았다.
Map() JS 내장 객체는 새로운 배열을 만드는 함수들을 갖고있는 객체이다.
map.set(a, (map.get(a) || 0) + 1)
map.set(b, (map.get(b) || 0) - 1)
이 코드로 설명을 하자면,
map.set(key값, value값)
- {key : value, key1 : value1 ....}
- 이러한 형태의 Hash Table을 만드는 함수이다
map.get(key값)
- 입력된 key값이 해당 Hash Table에 존재할 경우 True
- 없을 경우 False를 반환하는 함수이다
이 배경 지식들을 바탕으로, 풀이를 해보면
- map.get(key) || 0 ==> map.get이 false 면 0을
- map.get(key) && 0 ==> map.get이 true 면 0을
이 내용을 콘솔창에 찍어보면 이렇게 나온다 ( ̄︶ ̄)↗
마지막 undefined => -1은 completion 배열이 participant 배열보다 길이가 1 작기때문에 출력된 값이다.
즉 여기서 이 값들을 통해 Hash Table의 value 값이 0보다 큰 경우
for(let [key, value] of map){
if(value > 0){
return key
}
}
를 출력하면 탈락자의 key값이 return되게 되는것이다.
코드 하나로 몇시간을 보냈는지 모르겠다 🙂
하지만 이런게 싫다면 개발자 어떻게 해 ¯_(ツ)_/¯
즐겨~😁