1. 문제 요약
> 문제링크
1. 서로 선물 주고받은 기록이 있다면, 더 많이준 사람에게 선물 +1
2. 기록이 없다면, 선물지수가 큰 사람에게 선물 +1
3. 선물지수도 같다면, 생략
4. 선물지수 = 친구들에게 준 선물 수 - 받은 선물 수
2. 풀이
/**
* 프로그래머스 > 2024 KAKAO WINTHERSHIP : 가장 많이 받은 선물
* @param {string[]} friends : 친구 이름이 담긴 일차원 배열
* @param {string[]} gifts : ['준사람 받은사람'] 공백으로 구분된 선물 주고받은 기록
* @returns 다음 달에 가장 많은 선물을 받을 친구의 선물 갯수
*/
export function solution(friends, gifts) {
let answer = 0;
const arrObj = new Array();
const friendsLength = friends.length;
let giftRecords = new Array(friendsLength).fill(0).map(() => new Array(friendsLength).fill(0));
//데이터 구조화
friends.map(val => {
arrObj.push({ name: val, send: 0, receive: 0, point: 0, reword: 0 });
});
//선물기록 생성
for (let gift of gifts) {
const [send, receive] = gift.split(' ');
const sendIdx = arrObj.findIndex(({ name }) => send === name);
const receiveIdx = arrObj.findIndex(({ name }) => receive === name);
giftRecords[sendIdx][receiveIdx]++;
arrObj[sendIdx].send++;
arrObj[receiveIdx].receive++;
}
//선물지수 계산
arrObj.map(el => [(el.point = el.send - el.receive)]);
//선물기록 비교
for (let i = 0; i < friendsLength; i++) {
for (let j = 0; j < friendsLength; j++) {
if (i === j) continue; //본인 생략
if (giftRecords[i][j] > giftRecords[j][i]) arrObj[i].reword++;
//선물지수 비교
if (giftRecords[i][j] === giftRecords[j][i]
|| (0 === giftRecords[i][j] && 0 === giftRecords[j][i])) {
if (arrObj[i].point === arrObj[j].point) return;
if (arrObj[i].point > arrObj[j].point) arrObj[i].reword++;
}
}
}
answer = arrObj
.map(val => {
return val.reword;
})
.reduce((acc, cur) => (acc > cur ? acc : cur));
return answer;
}
'Algorithm' 카테고리의 다른 글
[Java/백준] 25305.정렬 - 커트라인 (삽입정렬) (0) | 2022.11.10 |
---|---|
[Java/백준] 2587.정렬 - 대표값2 (선택정렬, 삽입정렬) (0) | 2022.11.08 |
[Java/백준] 2750.정렬 - 수 정렬하기1 (삽입정렬) (0) | 2022.11.07 |
[ Java/ 백준 ] 2480.조건문 - 주사위 세개 (0) | 2022.11.04 |
[Oracle / 프로그래머스] 입양 시각 구하기(2) - LEVEL, WITH AS (0) | 2022.02.17 |