function solution(participant, completion) {
completion.forEach(el => {
let idx = participant.indexOf(el)
participant.splice(idx, 1)
});
return participant[0]
}
completion
에 담긴 모든 요소에 대해서 participant
에 있을 경우 해당 인덱스를 찾아서 배열에서 제거해주는 방식으로 풀었을 때, 효율성 검사를 통과하지 못한다.
indexOf
는 호출될 때마다 0번 인덱스부터 완전 탐색을 통해서 요소를 탐색하기 때문에 completion
과 participant
의 요소가 많으면 시간이 오래 걸릴 수 밖에 없다.
function solution(participant, completion) {
var answer = ''
let part = Object()
participant.forEach(el => {
if (part[el] === undefined) {
part[el] = 1
} else {
part[el]++
}
});
completion.forEach(el => {
part[el] -= 1
});
const part_key = Object.keys(part)
const part_value = Object.values(part)
answer = part_key[part_value.indexOf(1)]
return answer
}
participant
의 요소를 key로 하여 해당 key값의 개수만큼 value를 가지는 part
Object 생성completion
의 요소를 key로 하여 해당 key값의 개수만큼 part
의 value값을 하나씩 차감part
의 key와 value를 가지는 배열을 각각 생성part_value
에서 값 1에 해당하는 요소의 인덱스와 같은 인덱스의 part_key
값 반환효율성 검사는 key값으로 value값에 바로 접근할 수 있는 Object를 이용해서 해결했다. Object를 이용하면 participant
과 completion
에 동일한 요소가 있을 수 있다는 문제의 제약사항을 해결할 수 있다. key : value 형태로 접근하면 시간 복잡도가 O(1)이기 때문에 쉽게 찾아서 값을 변경할 수 있다.
participant
가 N개의 요소를, completion
이 M개의 요소를 가진다고 했을 때, 효율성 검사를 통과하지 못한 코드는 (N*M) 번의 탐색이 필요하고, 효율성 검사를 통과한 코드는 최대 (2N+M)번을 탐색한다.