자료구조|알고리즘
2024.01.29 알고리즘
(*ᴗ͈ˬᴗ͈)ꕤ*.゚
2024. 1. 29. 00:00
가장 많이 받은 선물 (lv 1)
https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근방식
이차원 배열을 사용해야하나 어쩌나 고민을 하다가 객체로 접근하였다
선물지수를 위한 객체 하나, 얼마나 주고 받았는지 표현하는 객체 하나해서
두 개의 객체로 돌려돌려서 풀었는데 흠... 뭔가 탐탁지 않다
하 다른 사람의 멋진 풀이들을 많이 보고 싶은데,,,
아직 올라온지 얼마 되지 않은 문제라 아쉽다.
풀이방식
더보기
function solution(friends, gifts) {
const personalHistory = {}; // 선물 준 갯수 받은 갯수 정도만 기록할 예정인 객체
const groupHistory = {}; // 누가 뭘 줬고 몇 개 줬는지 기록 예정인 객체
// 선물 주고 받은 기록을 forEach 돌려서 객체에 기록한다
gifts.forEach(gift => {
const [giver, taker] = gift.split(' ');
if (!personalHistory[giver]) personalHistory[giver] = {}
if (!personalHistory[taker]) personalHistory[taker] = {}
if (!groupHistory[giver]) groupHistory[giver] = {}
if (!groupHistory[taker]) groupHistory[taker] = {}
// giveCount 계산
personalHistory[giver].giveCount ?
personalHistory[giver].giveCount++ : personalHistory[giver].giveCount = 1;
// takeCount 계산
personalHistory[taker].takeCount ?
personalHistory[taker].takeCount++ : personalHistory[taker].takeCount = 1;
// 주고받은 값 계산
groupHistory[giver][taker] ?
groupHistory[giver][taker]++ : groupHistory[giver][taker] = 1;
groupHistory[taker][giver] ?
groupHistory[taker][giver]-- : groupHistory[taker][giver] = -1;
})
// 다음 달에 가장 많은 선물을 받는 친구가 받을 선물의 수
return friends.reduce((a, friend, i, t) => {
const giftList = groupHistory[friend] ?? {};
const giftIndex =
(personalHistory?.[friend]?.giveCount || 0) - (personalHistory?.[friend]?.takeCount || 0);
let nextGiftCount = 0;
// 친구들 배열을 가져와서 한 명 한 명 대조 시작
t.forEach(name => {
// 자기 자신이면 loof 빠져나가기
if (name === friend) return;
// 주고 받은 선물 횟수 비교
if(giftList[name]) {
if(giftList[name] > 0) nextGiftCount++;
return;
}
// 선물 지수 비교
const friendTotalCount =
(personalHistory?.[name]?.giveCount || 0) - (personalHistory?.[name]?.takeCount || 0);
if(giftIndex > friendTotalCount) nextGiftCount++;
})
return Math.max(a, nextGiftCount);
}, 0)
}