자료구조|알고리즘

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)
}