처음 풀엇는데,, 정확성은 맞았지만 효율성은 다 터졌다 ㅠㅡㅠ!
function solution(info, query) {
var answer = [];
const person=info.map(function(information){
var temp=information.split(" ");
return{
language:temp[0],
work:temp[1],//직무
career : temp[2],
food:temp[3],
test:temp[4],
}
})
//console.log(person);
for(var i=0;i<query.length;i++){
var temp = query[i].split(" ");
//0 2 4 6 7
var condition=[temp[0],temp[2],temp[4],temp[6],temp[7]];
solution(condition);
}
function solution(condition){
const result=person.filter(p=>{
if(p.language==condition[0]||condition[0]=='-'){
if(p.work==condition[1]||condition[1]=='-'){
if(p.career==condition[2]||condition[2]=='-'){
if(p.food==condition[3]||condition[3]=='-'){
if(parseInt(p.test)>=parseInt(condition[4])){
return true;
}
}
}
}
}
return false;
});
answer.push(result.length);
}
return answer;
}
그래서 방법을 바꿔야했고,,
조사한 결과 이분 탐색을 써야함을 알게되었다.
이 코드를 참고하여 원리를 이해하고 코드를 작성하였다.
function solution(info, query) {
var map ={};
var result=[];
for(var i=0;i<info.length;i++){
var temp=info[i].split(" ");
var score=temp.pop();
comb(temp,score,0);
}
function comb(arr,score,index){
var key=arr.join("");
var exist=map[key];
if(exist){
map[key].push(score);
}else{
map[key]=[score];
}
for(var i=index;i<4;i++){
let tmp=[...arr];
tmp[i]='-';
comb(tmp,score,i+1);
}
}
for(var key in map){
map[key].sort((a,b)=>a-b);
}
for(var i=0;i<query.length;i++){
var qr= query[i].replace(/ and /g,"").split(" ");
var query_score=qr.pop();
if(map[qr[0]]){
result.push(binary(map[qr[0]],query_score));
}
else result.push(0);
}
function binary(candidate,score){
var start = 0;
var end = candidate.length;
while(start < end){
var mid = Math.floor((start+end)/2);
if(Number(candidate[mid]) >= score){ // 현재 가르키는 값보다 내가 찾는 값이
end = mid;
}else if(Number(candidate[mid]) < score){
start = mid + 1;
}
}
return candidate.length-start;
}
return result;
}
이 문제에서 사용된 Number와 ParseInt의 차이
=> https://jamong-icetea.tistory.com/14
이 문제에서 사용된 for in, 그리고 for of에 대해
=> https://yjshin.tistory.com/entry/JavaScript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-for-%EB%AC%B8-for-in-%EB%AC%B8-for-of-%EB%AC%B8
이 코드를 작성하면서 들었던 의문점
=> https://velog.io/@pigu/javascript-%EB%B0%B0%EC%97%B4-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8
그리고 생각할 점, 위 두 코드의 효율성의 차이가 나는 이유가 뭘까?