๐Ÿ”ข Algorithm

[Javascript][๋ฐฑ์ค€] 1091๋ฒˆ - ์นด๋“œ ์„ž๊ธฐ

์œค๋„๊ธฐ 2025. 3. 27. 03:27
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ์ด์ง€๋งŒ, ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์นด๋“œ ์„ž๊ธฐ์™€ ๋ถ„๋ฐฐ ๊ณผ์ •์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ๋“ค์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  1. ์‚ฌ์ดํด ๊ฐ์ง€: ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์† ์„ž๋‹ค ๋ณด๋ฉด ๊ฒฐ๊ตญ ์ด์ „์— ๋‚˜ํƒ€๋‚ฌ๋˜ ํŒจํ„ด์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  2. ์นด๋“œ ์œ„์น˜์™€ ํ”Œ๋ ˆ์ด์–ด ๋งคํ•‘: ์นด๋“œ๊ฐ€ ๋†“์ธ ์œ„์น˜์— ๋”ฐ๋ผ ์–ด๋–ค ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ๋ถ„๋ฐฐ๋˜๋Š”์ง€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. 0, 3, 6... ์œ„์น˜์˜ ์นด๋“œ๋Š” ํ”Œ๋ ˆ์ด์–ด 0์—๊ฒŒ, 1, 4, 7... ์œ„์น˜์˜ ์นด๋“œ๋Š” ํ”Œ๋ ˆ์ด์–ด 1์—๊ฒŒ, 2, 5, 8... ์œ„์น˜์˜ ์นด๋“œ๋Š” ํ”Œ๋ ˆ์ด์–ด 2์—๊ฒŒ ๊ฐ‘๋‹ˆ๋‹ค. ์ฆ‰, ์œ„์น˜ i์˜ ์นด๋“œ๋Š” ํ”Œ๋ ˆ์ด์–ด i % 3์—๊ฒŒ ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค:

  1. ์ดˆ๊ธฐ ๋ฑ ์ƒํƒœ ์„ค์ • (์นด๋“œ ๋ฒˆํ˜ธ์™€ ์œ„์น˜๊ฐ€ ์ผ์น˜)
  2. ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค:
    • ์นด๋“œ๋ฅผ ์ฃผ์–ด์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ž๊ธฐ
    • ์˜ฌ๋ฐ”๋ฅธ ๋ถ„๋ฐฐ์ธ์ง€ ํ™•์ธ
    • ์ด์ „์— ๋ณธ ํŒจํ„ด์ธ์ง€ ํ™•์ธ (์‚ฌ์ดํด ๊ฐ์ง€)

 

ํ’€์ด

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(N² * N!) (N: ์นด๋“œ์˜ ์ˆ˜)
function solution() {
    // ๊ฐ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์นด๋“œ ๋ชฉ๋ก
    const playerCards = {};
    for(let i = 0; i < N; i++) {
        if(!playerCards[P[i]]) {
            playerCards[P[i]] = [];
        }
        playerCards[P[i]].push(i);
    }

    // ์ดˆ๊ธฐ ๋ฑ ์ƒํƒœ - ์นด๋“œ ๋ฒˆํ˜ธ์™€ ์œ„์น˜๊ฐ€ ์ผ์น˜
    let deck = Array.from({ length: N }, (_, i) => i);

    // ์ดˆ๊ธฐ ๋ฑ ์ƒํƒœ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์น˜๋๋Š”์ง€ ํ™•์ธ
    if(isCorrectlyDistributed(deck)) {
        return 0;
    }

    // ํ˜„์žฌ ๋ฑ์—์„œ ์นด๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์น˜๋๋Š”์ง€ ํ™•์ธ
    function isCorrectlyDistributed(deck) {
        for(const [player, cards] of Object.entries(playerCards)) {
            for(const card of cards) {
                if(deck.indexOf(card) % 3 !== Number(player)) {
                    return false;
                }
            }
        }
        return true;
    }

    const visited = new Set([JSON.stringify(deck)]);
    let count = 0;

    while(1) {
        // ์นด๋“œ ์„ž๊ธฐ
        const newDeck = Array(N);
        for(let i = 0; i < N; i++) {
            newDeck[S[i]] = deck[i];
        }
        deck = newDeck;
        count++;

        // ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์น˜๋๋Š”์ง€ ํ™•์ธ
        if(isCorrectlyDistributed(deck)) {
            return count;
        }

        // ๋™์ผํ•œ ํŒจํ„ด ๋ฐœ์ƒ ์‹œ
        const deckStr = JSON.stringify(deck);
        if(visited.has(deckStr)) {
            return -1;
        }
        visited.add(deckStr);
    }

    return -1;
}
๋ฐ˜์‘ํ˜•