[프로그래머스] n + 1 카드게임 풀이

riassuc·2024년 1월 21일

[프로그래머스] 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;
};
profile
riassuc

0개의 댓글