# [해시][Lv1] 완주하지 못한 선수 - 자바스크립트
# 프로그래머스 문제
https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript (opens new window)
# 시도 1.
해시라는 걸 고려 안하고 그냥 테스트 케이스를 통과하기 위해 작성한 코드.
indexof
함수로 completion 배열에 참가자가 있는지 확인함. 없으면 -1 리턴some
은 조건이 true가 되면 중지되기때문에 indexof 결과값이 -1이 되면 중지 되도록 사용splice
제약조건 중 동명이인을 거르기위함. 한번 검사한 이름은 삭제한다.
결과는 ✨효율성 대실패!✨ 애초에 자료구조를 공부하기 위함이었으니 해시를 찾아보고, 개념을 잡은 후 다시 시도했다.
function solution(participant, completion) {
var answer = '';
participant.some(function(v){
let targetIndex = completion.indexOf(v);
if(targetIndex === -1) answer = v;
else completion.splice(targetIndex, 1);
return targetIndex === -1;
})
return answer;
}
정확성 테스트
테스트 1 〉 통과 (0.09ms, 30.1MB)
테스트 2 〉 통과 (0.08ms, 30MB)
테스트 3 〉 통과 (0.57ms, 30.1MB)
테스트 4 〉 통과 (0.79ms, 30MB)
테스트 5 〉 통과 (0.84ms, 30.2MB)
효율성 테스트
테스트 1 〉 통과 (52.70ms, 41.5MB)
테스트 2 〉 실패 (시간 초과)
테스트 3 〉 실패 (시간 초과)
테스트 4 〉 실패 (시간 초과)
테스트 5 〉 실패 (시간 초과)
# 시도 2.
사실.. 해시라는 걸 여기서 접목하거나 그러진 않은 것 같다.
정렬이 생각났고, 정렬하면 중복이름이 있어도 순차적으로 비교만하면 될것같았다.
또한 foreach.. map등보다 기본 for문이 가장 효율이 좋으니 for문또한 기본으로 작성했더니 통과함
function solution(participant, completion) {
var answer = '';
participant.sort();
completion.sort();
for(var i=0; i<participant.length; i++){
if(participant[i] !== completion[i]){
answer = participant[i];
break;
}
}
return answer;
}
정확성 테스트
테스트 1 〉 통과 (0.06ms, 29.9MB)
테스트 2 〉 통과 (0.07ms, 30.2MB)
테스트 3 〉 통과 (0.29ms, 30.3MB)
테스트 4 〉 통과 (0.62ms, 30.2MB)
테스트 5 〉 통과 (0.56ms, 30.4MB)
효율성 테스트
테스트 1 〉 통과 (46.25ms, 41.5MB)
테스트 2 〉 통과 (71.41ms, 48MB)
테스트 3 〉 통과 (108.16ms, 52MB)
테스트 4 〉 통과 (100.90ms, 55.4MB)
테스트 5 〉 통과 (100.35ms, 53.5MB)
# map을 사용한 방법
해시를 공부하고 map
을 써서 하고싶었는데 다른 방법이 생각나서 못했음.. 이렇게 푸신 분이 계시나 찾아봤는데 이코드 (opens new window)을 발견했다. map을 알고도 어떻게 써야할지 감을 못잡았는데... 이런 아이디어가 있구나 배웠다.
# 풀이 방법
- 마라톤 참가자들의 이름을 key로 하고 value는 그 key를 가진 참가자의 명수로 하는 hashMap을 만든다.
- 완주자 배열에서 이름을 하나씩 꺼내 hashMap에서 같은 key의 value를 -1한다.
- 결국 completion의 길이는 participant의 길이보다 1 작음으로 0이 아닌 key가 완주하지 못한 참가자이다.
function solution(participant, completion) {
const hashMap = new Map();
let answer = '';
// 마라톤 참가자들의 이름을 key로 하고 value는 그 key를 가진 참가자의 명수로 하는 hashMap을 만든다.
participant.forEach( p => {
let isExist = hashMap.get(p);
if(isExist) hashMap.set(p, isExist + 1)
else hashMap.set(p, 1)
})
//완주자 배열에서 이름을 하나씩 꺼내 hashMap에서 같은 key의 value를 -1한다.
completion.forEach( p => {
hashMap.set(p, hashMap.get(p) -1)
})
// 결국 completion의 길이는 participant의 길이보다 1 작음으로 0이 아닌 key가 완주하지 못한 참가자이다.
hashMap.forEach((i, v) => {
if(i!==0){
answer = v;
return;
}
})
return answer;
}