코딩테스트/프로그래머스

[프로그래머스 Lv1] 가장 많이 받은 선물

박창준 2024. 12. 2. 14:17

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

Sol

먼저 준 선물과 받은 선물에 대해서 사용자별로 객체를 만들어서 아래처럼 초기값을 만들어주었다.

muzi:{
  ryan : [0,3],
  frodo: [2, 1],
  neo: [0, 1]
},

ryan:{
 muzi:[3,0],
 frodo:[0,1],
 neo: [0,0] 
},

frodo:{
 muzi:[1,2],
 ryan:[1,0],
 neo:[0,0]
}

neo:{ 
 muzi: [1,0],
 ryan:[0,0],
 frodo:[0,0] 
}



그리고 각 객체를 순회하면서 준 선물 - 받은선물의 total값을 score(선물지수)에 저장하는 과정을 거쳤다.

그러면 아래와 같이 값이 들어온다.

 

muzi:{
  ryan : [0,3],
  frodo: [2, 1],
  neo: [0, 1],
  score : -2
},

ryan:{
 muzi:[3,0],
 frodo:[0,1],
 neo: [0,0],
 score : 2
},

frodo:{
 muzi:[1,2],
 ryan:[1,0],
 neo:[0,0],
 score : 0
}

neo:{ 
 muzi: [1,0],
 ryan:[0,0],
 frodo:[0,0] 
 score : 1
}

 

위 객체를 활용해서 준선물 - 받은선물을 수행했을 때 값이 더 크면 선물을 하나 더 받고 (result+1),

주고받은 게 없거나 준선물 - 받은선물 = 0이면 score가 더 큰 사람에게 선물을 하나 더 준다 (result+1)
그리고 이 result값을 전역에 있는 max값과 비교해 매번 갱신해주었다.

 

function solution(friends, gifts) {
    
    var obj ={};
    let max = -1;
    
    // 초기화
    for(var i=0;i<friends.length ; i++){
        const giver = friends[i];
        obj = {...obj, [giver]: null};
        for(var j=0; j<friends.length ; j++){
            const getter= friends[j];
            if(giver===getter) continue;
            const objA = obj[giver];
            obj ={...obj,[giver]: {...objA ,[getter]: [0,0]}};
        }
    }
    
    // 선물 준거 초기화
    gifts.forEach((item)=>{
        const [giver, getter] = item.split(" ");
        const giverCount =obj[giver][getter][0];
        const getterCount = obj[giver][getter][1];
        const objA = obj[giver];
        
        // set getter
        obj ={...obj,[giver] :{...objA , [getter]:[(giverCount+1),getterCount]}}
        
        const giverCount2 = obj[getter][giver][0];
        const getterCount2 = obj[getter][giver][1];
        const objB = obj[getter];
        
        // set giver
        obj ={...obj,[getter] :{...objB , [giver]:[giverCount2,(getterCount2+1)]}}
    })
    
    // 선물 지수 셋팅
    for(const getter in obj){
        let totalScore =0;
        for (const giver in obj[getter]){
            if(Array.isArray(obj[getter][giver])){
                const [value1, value2] = obj[getter][giver];
                totalScore += value1 - value2;
            }
        }
        obj[getter].score= totalScore;
        obj[getter].result = 0;
    }
    
    // 총 받는 선물 계산
    for(const getter in obj){
        let totalScore =0;
        for (const giver in obj[getter]){
            if(Array.isArray(obj[getter][giver])){
                const [value1, value2] = obj[getter][giver];
                // 선물 주고받은게 같다면
                if((value1 - value2)===0){
                    const getterScore = obj[getter].score;
                    const giverScore = obj[giver].score;
                    
                    if(getterScore > giverScore){
                        const result = obj[getter].result;
                        obj[getter].result =  result+1;
                    }
                }
                else if(value1 >value2){
                    const result = obj[getter].result;
                    obj[getter].result =  result+1;
                }
                if(obj[getter].result > max) max= obj[getter].result;
            }
        }
    }

    return max    
}