728x90
map 자료형을 활용한 나름 간단한(?) 구현문제이다.
https://school.programmers.co.kr/learn/courses/30/lessons/258712
map자료형에 사람이름을 key로 두고 send에는 해당 사람이 보낸 사람들의 목록을 , get에는 내가 받은 사람의 목록을 저장한다.
사람들끼리 선물을 돌리게 하기 위해서 반복문을 사용하면서 순회하고, 서로 선물을 주고받으면 된다.
1. 서로선물을 주고받은 경우 -> 더 많이 선물을 준사람이 받음
2. 서로 선물을 주고받은 수가 같은 경우 -> 선물포인트를 계산하여 더 큰사람이 받음
function solution(friends, gifts) {
const map = new Map()
const retMap = new Map()
for (const friend of friends){
const initialFrined = {
send : [],
get : []
}
map.set(friend,initialFrined)
retMap.set(friend,0)
}
for(const gift of gifts){
const [a,b] = gift.split(' ')
map.get(a).send.push(b)
map.get(b).get.push(a)
}
const getGiftPoint = (name) => {
return map.get(name).send.length - map.get(name).get.length
}
const getGift = (name) => {
retMap.set(name,retMap.get(name)+1)
}
//선물 주고받기
for(let i = 0 ; i < friends.length; i++){
const A = friends[i]
for(let j = i+1 ; j < friends.length ; j++){
const B = friends[j]
const giftCntAToB = map.get(A).send.reduce((a,c) => c===B ?a+1:a,0)
const giftCntBToA = map.get(B).send.reduce((a,c) => c===A ?a+1:a,0)
if(giftCntAToB === giftCntBToA){
const AGiftPoint = getGiftPoint(A)
const BGiftPoint = getGiftPoint(B)
if(AGiftPoint>BGiftPoint) getGift(A)
else if (BGiftPoint>AGiftPoint) getGift(B)
} else {
if(giftCntAToB > giftCntBToA) getGift(A)
else getGift(B)
}
}
}
console.log(retMap)
return Math.max(...[...retMap].map(v => v[1]))
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS] 도넛과 막대 그래프 (1) | 2024.01.12 |
---|---|
[JS] 등굣길 (0) | 2024.01.11 |
[JS] 주사위 고르기 (0) | 2024.01.06 |
[JS] n+1 카드게임 (1) | 2024.01.05 |
[JS] 네트워크 (1) | 2024.01.03 |