n + 1 카드게임
Lv. 3
Solution
export function cardGame(coin: number, cards: number[]): number {
const n = cards.length;
const target = n + 1;
const origin = new Set(cards.slice(0, n / 3));
const pairs: number[][] = [];
const currentCards = new Set();
const getCost = (...usedCards: number[]): number => {
return usedCards.filter((card) => !origin.has(card)).length;
};
const addCard = (card: number): void => {
currentCards.add(card);
const targetCard = target - card;
if (currentCards.has(targetCard)) {
pairs.push([card, targetCard, getCost(card, targetCard)]);
pairs.sort((a, b) => b[2] - a[2]);
}
};
const removeCard = (card: number): void => {
origin.delete(card);
currentCards.delete(card);
};
let round = 1;
let currentIndex = n / 3;
let remainCoin = coin;
for (const card of origin) {
addCard(card);
}
while (currentIndex < n - 1) {
addCard(cards[currentIndex]);
addCard(cards[currentIndex + 1]);
const pair = pairs.pop();
if (!pair) {
return round;
}
const [card1, card2, cost] = pair;
remainCoin -= cost;
removeCard(card1);
removeCard(card2);
if (remainCoin < 0) {
return round;
}
round += 1;
currentIndex += 2;
}
return round;
}