프로그래머스 가장 많이 받은 선물 javascript

곰개구리·2024년 1월 7일
0

알고리즘

목록 보기
5/5
post-thumbnail
post-custom-banner

문제 링크

문제 해석

  1. 개인이 주고받은 선물 지수를 계산해야 한다
    • 선물 지수 = total(받은 선물) + -1 * total(준 선물)
    • 위 계산식을 통해 선물 지수를 계산한다
  2. 서로 주고받은 선물 개수를 파악해야 한다

위 계산을 바탕으로 pseudo code는 아래와 같다

for friend in friends:
  for relation in relations:
    tempAnswer is 0
    if(relation.from 이 준 선물 수 > relation.to 이 준 선물 수) {
      tempAnswer is tempAnswer + 1
    }
    else if(relation.from 이 준 선물 수 > relation.to 이 준 선물 수) {
      if(선물 지수.relation.from > 선물 지수.relation.to) {
        tempAnswer += 1
      }
    }
  answer = max(
	answer, tempAnswer
  )
return answer

문제 풀이

  • 친구 정보, 선물 정보를 기반으로 dstData라는 데이터를 파싱하여 사용하였다.
  • 파싱된 dstData의 기반 타입은 아래와 같다.
interface friendGift {
  [key: string]: {
    [key: string]: number | number[]; // 이름이 같을 경우 number, 다를 경우 number[]
  };
}
  • 작성 코드는 아래와 같다.
function solution(friends, gifts) {
    let answer = 0; // 정답
    let dstData = {}; // 파싱될 데이터 초기화
    // dstData 초기화
    friends.forEach(outerName => {
        dstData[outerName] = {}
        friends.forEach(innerName => {
            if(outerName !== innerName) { // 이름이 같지 않을 경우 [준 개수 = 0, 받은 개수 = 0] 으로 초기화
                dstData[outerName][innerName] = [
                  0, // 준 개수 
                  0 // 받은 개수
                ]
            }
            // 이름이 같은 경우 선물 지수 0으로 초기화
            else {
                dstData[outerName][innerName] = 0
            }
        })
    })
    // dstData 파싱
    gifts.forEach(gift => {
        [
          from, // 선물을 준 사람
          to // 선물을 받은 사람
        ] = gift.split(' ')
        dstData[from][from] += 1 // 선물을 준 사람의 선물 지수 증감
        dstData[to][to] -= 1 // 선물을 받은 사람의 선물 지수 감소
        // 선물 계수 계산
        dstData[from][to][0] += 1
        dstData[to][from][1] += 1
    })
    Object.entries(dstData).forEach(([name, giftDatas], index) => {
        tempAnswer = 0; // 임시 정답 데이터
        Object.entries(giftDatas).forEach(([toName, giftData], index) => {
            // 받은 사람과 준 사람의 이름이 다른 경우
            if(name !== toName) {
                const [
                  give, // 선물 준 사람 
                  receive // 선물 받은 사람
                ] = [...giftData]
                // 선물 준 사람의 갯수가 더 많을 경우
                if(give > receive) {
                    // 정답 증가
                    tempAnswer += 1
                }
                // 선물 준 사람과 받은 사람의 갯수가 같을 경우
                else if(give === receive) {
                    // 선물 지수 비교
                    // 준 사람의 선물 지수가 큰 경우에만 정답 증가
                    if(dstData[name][name] > dstData[toName][toName]) {
                        tempAnswer += 1
                    }
                }
            }
        })
        // 정답 갱신
        answer = Math.max(answer, tempAnswer)
    })
    return answer;
}
profile
개굴개굴 곰개굴
post-custom-banner

0개의 댓글