코딩테스트/프로그래머스
[프로그래머스 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
}