๐ข Algorithm
[Javascript][๋ฐฑ์ค] 1091๋ฒ - ์นด๋ ์๊ธฐ
์ค๋๊ธฐ
2025. 3. 27. 03:27
๋ฐ์ํ
๋ฌธ์
์ด ๋ฌธ์ ๋ ๋จ์ํ ๊ตฌํ ๋ฌธ์ ์ด์ง๋ง, ๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์นด๋ ์๊ธฐ์ ๋ถ๋ฐฐ ๊ณผ์ ์ ์ ํํ ํ์ ํด์ผ ํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ์ ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ๋ค์ ๊ณ ๋ คํ๋ ๊ฒ์ ๋๋ค:
- ์ฌ์ดํด ๊ฐ์ง: ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ์ ์๋ค ๋ณด๋ฉด ๊ฒฐ๊ตญ ์ด์ ์ ๋ํ๋ฌ๋ ํจํด์ด ๋ค์ ๋ํ๋ฉ๋๋ค.
- ์นด๋ ์์น์ ํ๋ ์ด์ด ๋งคํ: ์นด๋๊ฐ ๋์ธ ์์น์ ๋ฐ๋ผ ์ด๋ค ํ๋ ์ด์ด์๊ฒ ๋ถ๋ฐฐ๋๋์ง ๊ฒฐ์ ๋ฉ๋๋ค. 0, 3, 6... ์์น์ ์นด๋๋ ํ๋ ์ด์ด 0์๊ฒ, 1, 4, 7... ์์น์ ์นด๋๋ ํ๋ ์ด์ด 1์๊ฒ, 2, 5, 8... ์์น์ ์นด๋๋ ํ๋ ์ด์ด 2์๊ฒ ๊ฐ๋๋ค. ์ฆ, ์์น i์ ์นด๋๋ ํ๋ ์ด์ด
i % 3
์๊ฒ ๋ถ๋ฐฐ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค:
- ์ด๊ธฐ ๋ฑ ์ํ ์ค์ (์นด๋ ๋ฒํธ์ ์์น๊ฐ ์ผ์น)
- ๊ฐ ๋จ๊ณ๋ง๋ค:
- ์นด๋๋ฅผ ์ฃผ์ด์ง ๋ฐฉ๋ฒ์ผ๋ก ์๊ธฐ
- ์ฌ๋ฐ๋ฅธ ๋ถ๋ฐฐ์ธ์ง ํ์ธ
- ์ด์ ์ ๋ณธ ํจํด์ธ์ง ํ์ธ (์ฌ์ดํด ๊ฐ์ง)
ํ์ด
- ์๊ฐ๋ณต์ก๋:
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;
}
๋ฐ์ํ