๐ฒ ํผํํธ ์๋ฆฌ ์ฐพ๊ธฐ! (๊ฐ์ ์ฆ๋ณดํ)
์๋ฆฌ๋ฅผ ์๋ ๋ชจ๋ ๊ณผ์ ์ ์ค์๊ฐ์ผ๋ก ์ง์ผ๋ณด์ธ์!
๐ซ ๋์ด์ฐ๊ธฐ๋ก ์ง๊ฟ์ ์ง๊ณ , ์ํฐ(์ค๋ฐ๊ฟ)๋ก ์ถ๊ฐํ์ธ์!
์๋ก์ด ์๋ฆฌ ๋ฝ๊ธฐ!
๐ ๋์ค๊ฐ ํด๋ผ์ฐ๋์์ ์๋ฆฌ๋ฅผ ์๋ ์ค์ด์์...
๐ป [ํฌ๋ช ๊ณต๊ฐ] ์๋ฆฌ ๋ฐฐ์น ์์ค ์ฝ๋
export default { async fetch(request, env, ctx) { // 1. CORS ์ฒ๋ฆฌ (ํ๋ก ํธ์๋์์ API๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ์ฉ) if (request.method === "OPTIONS") { return new Response(null, { headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", } }); } if (request.method !== "POST") { return new Response("Method Not Allowed", { status: 405 }); } // 2. ํ๋ก ํธ์๋์์ ๋ณด๋ธ ์ง๊ฟ ๋ฐ์ดํฐ ํ์ฑ const body = await request.json(); const enemiesInput = body.enemiesText || ""; let enemies = []; let lines = enemiesInput.split("\n"); for (let line of lines) { line = line.trim(); if (!line) continue; let parts = line.split(/[\s,]+/); if (parts.length >= 2) enemies.push([parts[0], parts[1]]); } // 3. ์๋ฆฌ ๋ฐฐ์น ํต์ฌ ๋ก์ง (๊ธฐ์กด _gC, _iA, _sS ํจ์ ๋์ฒด) const getCoords = i => i < 24 ? [Math.floor(i / 6), i % 6] : (i === 24 ? [4, 2] : [4, 3]); const isAdjacent = (i, j) => { let [a, b] = getCoords(i), [c, d] = getCoords(j); return Math.max(Math.abs(a - c), Math.abs(b - d)) <= 1; }; // ์์ปค ํ๊ฒฝ์ ๋ง๊ฒ ์ต์ ํ๋ ํผ์ -์์ด์ธ ์ ํ ์๊ณ ๋ฆฌ์ฆ const shuffle = a => { for (let c = a.length - 1; c > 0; c--) { let f = Math.floor(Math.random() * (c + 1)); [a[c], a[f]] = [a[f], a[c]]; } }; let seats = Array.from({ length: 26 }, (_, i) => String(i + 1)); let attempts = 1; let logs = []; // ํ๊ตญ ์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ธฐ๋ก const kstTime = new Date(new Date().getTime() + 9 * 60 * 60 * 1000).toISOString().replace('T', ' ').substring(0, 19); logs.push(`=== ๋์ค ์๋ฆฌ ๋ฐฐ์น ์์ (${kstTime}) ===\n[์ด์ ๋ถ๊ฐ ์กฐ๊ฑด]: ${JSON.stringify(enemies)}\n\n`); const MAX_ATTEMPTS = 10000; let success = false; // 4. ์๋ฆฌ ์๊ธฐ ๋ฐ๋ณต๋ฌธ while (attempts <= MAX_ATTEMPTS) { shuffle(seats); let seatMap = {}; for (let e = 0; e < 26; e++) seatMap[seats[e]] = e; let board = []; for (let e = 0; e < 4; e++) { let row = seats.slice(6 * e, 6 * (e + 1)); board.push(row.map(x => `[${x.padStart(2, " ")}]`).join(" ")); } let lastRow = seats.slice(24, 26); board.push(" " + `[${lastRow[0].padStart(2, " ")}] [${lastRow[1].padStart(2, " ")}]`); let boardStr = board.join("\n"); let conflict = null; for (let [e1, e2] of enemies) { let idx1 = seatMap[e1]; let idx2 = seatMap[e2]; if (idx1 !== undefined && idx2 !== undefined && isAdjacent(idx1, idx2)) { conflict = [e1, e2]; break; } } if (conflict) { logs.push(`[์๋ ${attempts}] โ ์คํจ: '${conflict[0]}' & '${conflict[1]}' ์ด์ํจ\n${boardStr}\n\n`); attempts++; } else { logs.push(`๐ [์๋ ${attempts}] โ ์ต์ข ์ฑ๊ณต!\n${boardStr}\n====================\n`); success = true; break; } } if (!success) { logs.push(`๐จ ์คํจ: ์กฐ๊ฑด์ด ๋๋ฌด ๊น๋ค๋ก์ ${MAX_ATTEMPTS}๋ฒ ์๋ ํ ์์ ์ค๋จํ์ต๋๋ค!`); } const finalLogText = logs.join(""); // 5. ํ๋ก ํธ์๋๋ก ์ต์ข ๊ฒฐ๊ณผ ๋ฐํ return new Response(JSON.stringify({ success, attempts: success ? attempts : MAX_ATTEMPTS, logText: finalLogText }), { headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } }); } };