가장 많이 받은 선물
2024. 5. 27. 21:19ㆍ알고리즘/카카오
https://school.programmers.co.kr/learn/courses/30/lessons/258712
- 난이도 : Level 1
- 소요 시간 : 30분
- 실행 결과 : 통과
문제에서 요구한대로 그대로 구현만 하면 되는 간단한 문제이다.
핵심 요구사항은 다음달에 선물을 가장 많이 받게되는 사람의 선물갯수를 구하는 것이다.
1. 입력값 gifts를 이용해 주고 받은 선물을 표로 나타낸다.
2. 1번에서 구한 표를 이용해서 선물 지수를 구한다.
3. 조건에 맞게 다음달에 몇 개의 선물을 받을지 계산한다.
- A와 B 같이 두 명 사이의 관계에 다음과 같은 조건을 적용한다.
- 선물을 많이 주었다면 다음달에 선물을 받는다.
- 선물을 주고받은 갯수가 같거나 주고받은 기록이 없으면 선물지수가 더 큰 사람이 작은 사람에게 받는다.
- 선물 지수는 전체 친구에게 준 선물 - 전체 친구에게 받은 선물이다.
- 선물지수도 같다면 그냥 넘어간다.
function getGiftIdxs(table){
const n = table.length;
const ret = Array.from({length: n}).fill(0);
for(let i = 0; i<n; i++){
let give = 0;
let receive = 0;
for(let j = 0; j<n; j++){
give += table[i][j];
receive += table[j][i];
}
ret[i] = give - receive;
}
return ret;
}
function solution(friends, gifts) {
const n = friends.length;
const ret = Array.from({length: n}).fill(0);
// 1. 주고 받은 선물을 표로 나타낸다.
const idxs = new Map();
friends.forEach((elem, idx) => idxs.set(elem, idx));
const table = Array.from({length: n}, () => Array.from({length: n}).fill(0));
gifts.forEach((elem)=>{
const [giver, receiver] = elem.split(" ");
table[idxs.get(giver)][idxs.get(receiver)]++;
});
// 2. 선물 지수를 구한다.
const giftIdxs = getGiftIdxs(table);
// 3. 조건에 맞게 다음달에 몇개의 선물을 받을지 계산한다.
for(let i = 0; i<n; i++){
for(let j = 0; j<n; j++){
if(i === j) continue;
if(table[i][j] > table[j][i]) ret[i]++;
else if(table[i][j] === table[j][i] || table[i][j] === 0 && table[j][i] === 0){
if(giftIdxs[i] > giftIdxs[j]) ret[i]++;
}
}
}
return Math.max(...ret);
}
'알고리즘 > 카카오' 카테고리의 다른 글
주차 요금 계산 (0) | 2024.05.29 |
---|---|
양궁 대회 (0) | 2024.05.29 |
두 큐 합 같게 만들기 (0) | 2024.05.28 |
이모티콘 할인행사 (0) | 2024.05.28 |
개인정보 수집 유효기간 (0) | 2024.05.27 |