[프로그래머스] n + 1 카드게임 힌트
function solution(coin, cards) {
const n = cards.length;
const startIdx = n / 3;
const tar = n + 1;
const initialDraw = new Map();
const laterDraw = new Map();
const remove = [n, 2];
let pair = 0;
for (let i = 0; i < startIdx; i++) {
const cur = cards[i];
if (initialDraw.has(tar - cur)) {
pair++;
} else {
initialDraw.set(cur, true);
}
};
const available = [];
const removedPair = new Set();
let round = 1;
for (let i = startIdx; i < n; i+= 2) {
const draws = [i, i + 1];
draws.forEach(idx => {
const cur = cards[idx];
const cost = initialDraw.has(tar - cur) ? 0 : 1;
laterDraw.set(cards[idx], true);
available.push([idx, cost]);
});
if (pair > 0) {
pair -= 1;
round += 1;
continue;
} else {
available.sort((a, b) => {
return a[1] === b[1] ? b[0] - a[0] : a[1] - b[1];
});
while (available.length && available.at(-1) === null) {
available.pop();
}
let madePair = false;
for (let j = 0; j < available.length; j++) {
const [idx, cost] = available[j];
if (removedPair.has(cards[idx])) {
available[j] = remove;
continue;
}
const half = tar - cards[idx];
const laterHasHalf = laterDraw.has(half);
if (cost === 0 || laterHasHalf) {
available[j] = remove;
coin -= 1;
madePair = true;
if (laterHasHalf) {
removedPair.add(half);
coin -= 1;
}
}
if (coin < 0) {
break;
} else if (madePair) {
pair += 1;
break;
}
}
}
if (pair > 0) {
pair -= 1;
round += 1;
} else {
break;
}
}
return round;
};