김동규 김동규 09-23
가로세로낱말퀴즈
@36f0aebd5c6688e21c4bbcba8700f4d52281685f
html/popWin_crossword.html
--- html/popWin_crossword.html
+++ html/popWin_crossword.html
@@ -75,21 +75,22 @@
         <div class="crossword-footer">
             <div class="wrap">
                 <div class="btn-cont">
+                    <button type="button" id="reload-btn" class="btn-submit btn lg cta">다시풀기</button>
                     <button type="button" id="save-answer" class="btn-submit btn lg cta">제출하기</button>
                 </div>
             </div>
         </div>
     </div>
     
-    <script type="module" src="../resources/front/site/SITE_00000/event/crossword/js/crosswordPuzzle.js"></script>
+    <script type="module" src="../resources/front/site/SITE_00000/event/crossword/js/crosswordPuzzle_dev.js"></script>
     <script>
-        window.puzzleData = {
-            fncType: 'answer', // 퍼즐 만들기, 수정 : make, 퍼즐 해보기 : answer, 풀이한 퍼즐 보기 : view
-            loadPuzzleURL: "http://127.0.0.1:5500/resources/front/site/SITE_00000/event/crossword/js/temp/data.json", // 퍼즐 데이터를 읽어올 api url
-            puzzleID: "abc",// undefined, // 퍼즐 ID (수정시 필요, 생성시는 저장 시 퍼즐 ID 생성하고 리턴)
-            answerPuzzleURL: "http://127.0.0.1:5500/resources/front/site/SITE_00000/event/crossword/js/temp/answer.json", // 퍼즐 답변을 저장할 api url
-            afterSaveURL: 'crossword_view.html', // 저장 후 이동할 url
-        }
+        // window.puzzleData = {
+        //     fncType: 'answer', // 퍼즐 만들기, 수정 : make, 퍼즐 해보기 : answer, 풀이한 퍼즐 보기 : view
+        //     loadPuzzleURL: "../resources/front/site/SITE_00000/event/crossword/js/temp/data.json", // 퍼즐 데이터를 읽어올 api url
+        //     puzzleID: "abc",// undefined, // 퍼즐 ID (수정시 필요, 생성시는 저장 시 퍼즐 ID 생성하고 리턴)
+        //     answerPuzzleURL: "/resources/front/site/SITE_00000/event/crossword/js/temp/answer.json", // 퍼즐 답변을 저장할 api url
+        //     afterSaveURL: 'crossword_view.html', // 저장 후 이동할 url
+        // }
     </script>
 </body>
 </html>
(파일 끝에 줄바꿈 문자 없음)
 
resources/front/site/SITE_00000/event/crossword/js/crosswordPuzzle_dev.js (added)
+++ resources/front/site/SITE_00000/event/crossword/js/crosswordPuzzle_dev.js
@@ -0,0 +1,447 @@
+let puzzleSize = 8;
+let wordPuzzleJson = [];
+let grid = [];
+let hints = [];
+
+$(document).ready(function(){
+    const previewGrid = document.querySelector("#preview-grid");
+    const acrossHints = document.querySelector("#across-hints");
+    const downHints = document.querySelector("#down-hints");
+
+    fetch("../resources/front/site/SITE_00000/event/crossword/js/temp/data.json")
+            .then(response => response.json())
+            .then(data => {
+                wordPuzzleJson = data.words || [];
+                setupPuzzle(puzzleSize, wordPuzzleJson, drawPuzzle);
+            })
+            .catch(error => console.error("JSON 로드 실패:", error));
+
+ // 퍼즐 그리기 함수
+        const drawPuzzle = () => {
+            previewGrid.innerHTML = "";
+            acrossHints.innerHTML = "";
+            downHints.innerHTML = "";
+
+            const grid = Array.from({ length: puzzleSize }, () => Array(puzzleSize).fill(null));
+            const acrossList = [];
+            const downList = [];
+
+            let acrossCount = 1;
+            let downCount = 1;
+
+            wordPuzzleJson.forEach((wordObj) => {
+                const { word, hint, startX, startY, direction } = wordObj;
+                if (startX === -1 && startY === -1) return;
+
+                const hintNumber = direction === "horizontal" ? acrossCount++ : downCount++;
+                const hintInfo = {
+                    number: hintNumber,
+                    hint: hint,
+                    x: startX,
+                    y: startY,
+                    direction: direction
+                };
+
+                if (direction === "horizontal") {
+                    acrossList.push(hintInfo);
+                } else {
+                    downList.push(hintInfo);
+                }
+
+                for (let i = 0; i < word.length; i++) {
+                    const x = direction === "horizontal" ? startX + i : startX;
+                    const y = direction === "vertical" ? startY + i : startY;
+                    grid[y][x] = word[i];
+                }
+            });
+
+            // 힌트 목록 렌더링
+            const placedWords = wordPuzzleJson.map(item => ({
+                word: item.word,
+                startX: item.startX,
+                startY: item.startY,
+                direction: item.direction
+            }));
+
+            // 가로 힌트
+            acrossList.forEach((hint) => {
+                const listItem = document.createElement("li");
+                const word = placedWords.find(w => w.direction === "horizontal" && w.startX === hint.x && w.startY === hint.y);
+                const wordLength = word ? word.word.length : 0;
+                listItem.innerHTML = '<span class="hint-number">' + hint.number + '</span> ' + hint.hint + ' (' + wordLength + '칸)';
+                acrossHints.appendChild(listItem);
+            });
+
+            // 세로 힌트
+            downList.forEach((hint) => {
+                const listItem = document.createElement("li");
+                const word = placedWords.find(w => w.direction === "vertical" && w.startX === hint.x && w.startY === hint.y);
+                const wordLength = word ? word.word.length : 0;
+                listItem.innerHTML = '<span class="hint-number vertical">' + hint.number + '</span> ' + hint.hint + ' (' + wordLength + '칸)';
+                downHints.appendChild(listItem);
+            });
+
+            // 퍼즐 UI 렌더링
+            for (let y = 0; y < puzzleSize; y++) {
+                for (let x = 0; x < puzzleSize; x++) {
+                    const cell = document.createElement("div");
+                    cell.classList.add("grid-cell");
+                    cell.id = 'ans-cell-' + x + '-' + y;
+                    cell.setAttribute("data-x", x);
+                    cell.setAttribute("data-y", y);
+
+                    if (grid[y][x]) {
+                        const input = document.createElement("input");
+                        input.type = "text";
+                        input.maxLength = 1;
+                        input.inputMode = "verbatim";
+                        input.className = "input-cell";
+                        input.oninput = () => {
+                            if (input.value.length > 1) {
+                                input.value = input.value.slice(0, 1);
+                            }
+                            input.value = input.value.toUpperCase();
+                        };
+                        cell.appendChild(input);
+
+                        const hintsAtCell = [];
+                        const acrossHint = acrossList.find(h => h.x === x && h.y === y);
+                        const downHint = downList.find(h => h.x === x && h.y === y);
+                        if (acrossHint) hintsAtCell.push({ ...acrossHint, direction: 'horizontal' });
+                        if (downHint) hintsAtCell.push({ ...downHint, direction: 'vertical' });
+
+                        hintsAtCell.forEach(hint => {
+                            const hintNumber = document.createElement("span");
+                            hintNumber.textContent = hint.number.toString();
+                            hintNumber.className = "hint-number";
+                            if (hint.direction === "vertical") {
+                                hintNumber.classList.add("vertical");
+                            }
+                            cell.appendChild(hintNumber);
+                        });
+                    } else {
+                        cell.classList.add("disabled");
+                    }
+
+                    previewGrid.appendChild(cell);
+                }
+            }
+        };
+
+            function setupPuzzle(size, data, drawFn) {
+            const gridContainer = document.querySelector("#preview-grid");
+            if (gridContainer) {
+                gridContainer.style.gridTemplateColumns = 'repeat(' + size + ', 1fr)';
+                gridContainer.style.gridTemplateRows = 'repeat(' + size + ', 1fr)';
+            }
+
+            grid = Array.from({ length: size }, () => Array(size).fill(null));
+            drawFn(data, size);
+        }
+
+        
+
+        const drawCheckedPuzzle = function(data, puzzleSize) {
+            const previewGrid = document.querySelector("#preview-grid");
+            previewGrid.innerHTML = "";
+            previewGrid.style.gridTemplateColumns = 'repeat(' + puzzleSize + ', 1fr)';
+            previewGrid.style.gridTemplateRows = 'repeat(' + puzzleSize + ', 1fr)';
+
+            const grid = Array.from({ length: puzzleSize }, function() {
+                return Array(puzzleSize).fill(null);
+            });
+
+            let acrossCount = 1;
+            let downCount = 1;
+
+            const acrossHints = [];
+            const downHints = [];
+            const hintMap = {}; // 힌트 번호 저장용
+
+            data.forEach(function(item) {
+                const rspnsCn = item.rspnsCn;
+                const answerWord = item.answerWord;
+                const startX = item.startX;
+                const startY = item.startY;
+                const direction = item.direction;
+                const hint = item.hint;
+
+                if (startX === -1 && startY === -1) return;
+
+                const key = startX + ',' + startY;
+                if (!hintMap[key]) hintMap[key] = {};
+
+                let hintNumber;
+                if (direction === "horizontal") {
+                    hintNumber = acrossCount++;
+                    hintMap[key].across = hintNumber;
+                    acrossHints.push({ hintNumber: hintNumber, hint: hint, answerWord: answerWord });
+                } else {
+                    hintNumber = downCount++;
+                    hintMap[key].down = hintNumber;
+                    downHints.push({ hintNumber: hintNumber, hint: hint, answerWord: answerWord });
+                }
+
+                for (let i = 0; i < answerWord.length; i++) {
+                    const x = direction === "horizontal" ? startX + i : startX;
+                    const y = direction === "vertical" ? startY + i : startY;
+
+                    if (!grid[y][x]) grid[y][x] = {};
+
+                    if (!grid[y][x].value) {
+                        grid[y][x].value = rspnsCn ? rspnsCn[i] : "";
+                        grid[y][x].correct = rspnsCn && rspnsCn[i] === answerWord[i];
+                    }
+                }
+            });
+
+            for (let y = 0; y < puzzleSize; y++) {
+                for (let x = 0; x < puzzleSize; x++) {
+                    const cell = document.createElement("div");
+                    cell.classList.add("grid-cell");
+                    cell.id = 'ans-cell-' + x + '-' + y;
+                    cell.setAttribute("data-x", x);
+                    cell.setAttribute("data-y", y);
+
+                    const gridData = grid[y][x];
+                    if (gridData) {
+                        const input = document.createElement("input");
+                        input.type = "text";
+                        input.maxLength = 1;
+                        input.className = "input-cell";
+                        input.value = gridData.value || "";
+                        input.oninput = () => {
+                            input.value = input.value.charAt(0).toUpperCase();
+                        };
+                        input.value = input.value.trim();
+                        cell.appendChild(input);
+
+                        // 힌트 번호 표시 (가로, 세로 모두 가능)
+                        const key = x + ',' + y;
+                        if (hintMap[key]) {
+                            if (hintMap[key].across) {
+                                const hintSpanAcross = document.createElement("span");
+                                hintSpanAcross.className = "hint-number";
+                                hintSpanAcross.innerText = hintMap[key].across;
+                                cell.appendChild(hintSpanAcross);
+                            }
+                            if (hintMap[key].down) {
+                                const hintSpanDown = document.createElement("span");
+                                hintSpanDown.className = "hint-number vertical";
+                                hintSpanDown.innerText = hintMap[key].down;
+                                cell.appendChild(hintSpanDown);
+                            }
+                        }
+                    } else {
+                        cell.classList.add("disabled");
+                    }
+
+                    previewGrid.appendChild(cell);
+                }
+            }
+
+            // 힌트 영역 초기화
+            const acrossHintsContainer = document.querySelector("#across-hints");
+            const downHintsContainer = document.querySelector("#down-hints");
+            acrossHintsContainer.innerHTML = "";
+            downHintsContainer.innerHTML = "";
+
+            acrossHints.forEach(function(item) {
+                const li = document.createElement("li");
+                li.innerHTML = '<span class="hint-number">' + item.hintNumber + '</span> ' + item.hint + ' (' + item.answerWord.length + '칸)';
+                acrossHintsContainer.appendChild(li);
+            });
+
+            downHints.forEach(function(item) {
+                const li = document.createElement("li");
+                li.innerHTML = '<span class="hint-number vertical">' + item.hintNumber + '</span> ' + item.hint + ' (' + item.answerWord.length + '칸)';
+                downHintsContainer.appendChild(li);
+            });
+        };
+
+        $(document).on('click', '#reload-btn', function (e) {
+            location.reload();
+        });
+
+        $(document).on('click', '#save-answer', function (e) {
+            const answerWords = [];
+            wordPuzzleJson.forEach((word) => {
+                let rspnsCn = "";
+                let grading = 'Y';
+                let wordData;
+
+                if (word.hasOwnProperty("word")) {
+                    for (let i = 0; i < word.word.length; i++) {
+                        const x = word.direction === "horizontal" ? word.startX + i : word.startX;
+                        const y = word.direction === "vertical" ? word.startY + i : word.startY;
+                        const targetCell = document.querySelector('#ans-cell-' + x + '-' + y + ' input');
+                        const targetCellV = targetCell?.value.toUpperCase().trim();
+
+                        rspnsCn += targetCellV ? targetCellV : " ";
+
+                        if (word.word[i] !== targetCellV) {
+                            grading = 'N';
+                        }
+                    }
+
+                    wordData = {
+                        rspnsCn: rspnsCn,
+                        hint: word.hint,
+                        startX: word.startX,
+                        startY: word.startY,
+                        direction: word.direction,
+                        gradings: grading,
+                        answerWord: word.word
+                    };
+                } else {
+                    for (let i = 0; i < word.answerWord.length; i++) {
+                        const x = word.direction === "horizontal" ? word.startX + i : word.startX;
+                        const y = word.direction === "vertical" ? word.startY + i : word.startY;
+                        const targetCell = document.querySelector('#ans-cell-' + x + '-' + y + ' input');
+                        const targetCellV = targetCell?.value.toUpperCase().trim();
+
+                        rspnsCn += targetCellV ? targetCellV : " ";
+
+                        if (word.answerWord[i] !== targetCellV) {
+                            grading = 'N';
+                        }
+                    }
+
+                    wordData = {
+                        rspnsCn: rspnsCn,
+                        hint: word.hint,
+                        startX: word.startX,
+                        startY: word.startY,
+                        direction: word.direction,
+                        gradings: grading,
+                        answerWord: word.answerWord
+                    };
+                }
+
+                answerWords.push(wordData);
+            });
+                submitCheckedPuzzle(answerWords, puzzleSize);
+            });
+
+
+
+        const submitCheckedPuzzle = function(data, puzzleSize) {
+      const previewGrid = document.querySelector("#preview-grid");
+      previewGrid.innerHTML = "";
+      previewGrid.style.gridTemplateColumns = 'repeat(' + puzzleSize + ', 1fr)';
+      previewGrid.style.gridTemplateRows = 'repeat(' + puzzleSize + ', 1fr)';
+
+      const grid = Array.from({ length: puzzleSize }, function() {
+        return Array(puzzleSize).fill(null);
+      });
+
+      let acrossCount = 1;
+      let downCount = 1;
+
+      const acrossHints = [];
+      const downHints = [];
+      const hintMap = {}; // 힌트 번호 저장용
+
+      data.forEach(function(item) {
+        const rspnsCn = item.rspnsCn;
+        const answerWord = item.answerWord;
+        const startX = item.startX;
+        const startY = item.startY;
+        const direction = item.direction;
+        const hint = item.hint;
+
+        if (startX === -1 && startY === -1) return;
+
+        const key = startX + ',' + startY;
+        if (!hintMap[key]) hintMap[key] = {};
+
+        let hintNumber;
+        if (direction === "horizontal") {
+          hintNumber = acrossCount++;
+          hintMap[key].across = hintNumber;
+          acrossHints.push({ hintNumber: hintNumber, hint: hint, answerWord: answerWord });
+        } else {
+          hintNumber = downCount++;
+          hintMap[key].down = hintNumber;
+          downHints.push({ hintNumber: hintNumber, hint: hint, answerWord: answerWord });
+        }
+
+        for (let i = 0; i < answerWord.length; i++) {
+          const x = direction === "horizontal" ? startX + i : startX;
+          const y = direction === "vertical" ? startY + i : startY;
+
+          if (!grid[y][x]) grid[y][x] = {};
+
+          if (!grid[y][x].value) {
+            grid[y][x].value = rspnsCn ? rspnsCn[i] : "";
+            grid[y][x].correct = rspnsCn && rspnsCn[i] === answerWord[i];
+          }
+        }
+      });
+
+      for (let y = 0; y < puzzleSize; y++) {
+        for (let x = 0; x < puzzleSize; x++) {
+          const cell = document.createElement("div");
+          cell.classList.add("grid-cell");
+
+          const gridData = grid[y][x];
+          if (gridData) {
+            const input = document.createElement("input");
+            input.type = "text";
+            input.maxLength = 1;
+            input.className = "input-cell";
+            input.value = gridData.value || "";
+            input.readOnly = true;
+
+            if (gridData.correct) {
+              cell.classList.add("correct");
+            } else {
+              cell.classList.add("wrong");
+            }
+
+            cell.appendChild(input);
+
+            // 힌트 번호는 단어 시작 위치에만 표시
+            const key = x + ',' + y;
+            if (hintMap[key]) {
+              if (hintMap[key].across) {
+                const hintSpanAcross = document.createElement("span");
+                hintSpanAcross.className = "hint-number";
+                hintSpanAcross.innerText = hintMap[key].across;
+                cell.appendChild(hintSpanAcross);
+              }
+              if (hintMap[key].down) {
+                const hintSpanDown = document.createElement("span");
+                hintSpanDown.className = "hint-number vertical";
+                hintSpanDown.innerText = hintMap[key].down;
+                cell.appendChild(hintSpanDown);
+              }
+            }
+
+          } else {
+            cell.classList.add("disabled");
+          }
+
+          previewGrid.appendChild(cell);
+        }
+      }
+
+      // 힌트 영역 초기화
+      const acrossHintsContainer = document.querySelector("#across-hints");
+      const downHintsContainer = document.querySelector("#down-hints");
+      acrossHintsContainer.innerHTML = "";
+      downHintsContainer.innerHTML = "";
+
+      acrossHints.forEach(function(item) {
+        const li = document.createElement("li");
+        li.innerHTML = '<span class="hint-number">' + item.hintNumber + '</span> ' + item.hint + ' (' + item.answerWord.length + '칸)';
+        acrossHintsContainer.appendChild(li);
+      });
+
+      downHints.forEach(function(item) {
+        const li = document.createElement("li");
+        li.innerHTML = '<span class="hint-number vertical">' + item.hintNumber + '</span> ' + item.hint + ' (' + item.answerWord.length + '칸)';
+        downHintsContainer.appendChild(li);
+      });
+    };
+})(파일 끝에 줄바꿈 문자 없음)
resources/front/site/SITE_00000/event/crossword/js/temp/data.json
--- resources/front/site/SITE_00000/event/crossword/js/temp/data.json
+++ resources/front/site/SITE_00000/event/crossword/js/temp/data.json
@@ -1,61 +1,141 @@
 {
-    "size" : "10",
+    "size" : "8",
     "words" : [
-        {
-            "word": "ASDFG",
-            "hint": "경주에서 가장 거대한 석탑으로 신라 문무왕이 세운 탑의 이름",
-            "startX": 0,
-            "startY": 0,
-            "direction": "horizontal"
-        },
-        {
-            "word": "ABCDEF",
-            "hint": "abcdef",
-            "startX": 0,
-            "startY": 0,
-            "direction": "vertical"
-        },
-        {
-            "word": "GAG",
-            "hint": "gag",
-            "startX": 4,
-            "startY": 0,
-            "direction": "vertical"
-        },
-        {
-            "word": "DBA",
-            "hint": "dba",
-            "startX": 2,
-            "startY": 0,
-            "direction": "vertical"
-        },
-        {
-            "word": "CTADG",
-            "hint": "ctadg",
-            "startX": 0,
-            "startY": 2,
-            "direction": "horizontal"
-        },
-        {
-            "word": "DEAR",
-            "hint": "dear",
-            "startX": 3,
-            "startY": 2,
-            "direction": "vertical"
-        },
-        {
-            "word": "EDSAFE",
-            "hint": "edsafe",
-            "startX": 0,
-            "startY": 4,
-            "direction": "horizontal"
-        },
-        {
-            "word": "AEA",
-            "hint": "aea",
-            "startX": 5,
-            "startY": 3,
-            "direction": "vertical"
-        }
+                {
+                    "word": "고진감래",
+                    "hint": "쓴 것이 다하면 단 것이 온다는 뜻으로 고생 끝에 낙이 온다는 뜻의 사자성어",
+                    "startX": 0,
+                    "startY": 0,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "월계관",
+                    "hint": "고대 그리스에서 우승장의 머리에 씌워주던 월계수 잎으로 만든 관",
+                    "startX": 5,
+                    "startY": 0,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "이구동성",
+                    "hint": "입은 다르나 목소리는 같다는 뜻으로 여러 사람이 같은 말을 한다는 뜻의 사자성어",
+                    "startX": 2,
+                    "startY": 2,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "명연설",
+                    "hint": "아주 잘한 연설을 이르는 말",
+                    "startX": 0,
+                    "startY": 3,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "유교",
+                    "hint": "공자가 체계화한 사상으로 유학을 기반으로 한 종교",
+                    "startX": 6,
+                    "startY": 3,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "분서갱유",
+                    "hint": "중국 진나라 시황제가 책을 불사르고 학자들을 산채로 묻은 사건",
+                    "startX": 3,
+                    "startY": 4,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "농구",
+                    "hint": "손으로 하는 구기 종목으로 그물이 있는 골대에 공을 던져서 득점하는 스포츠",
+                    "startX": 0,
+                    "startY": 5,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "어부지리",
+                    "hint": "양쪽의 다툼을 틈타 제 3 자가 이익을 얻는다는 뜻의 사자성어",
+                    "startX": 1,
+                    "startY": 6,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "종묘",
+                    "hint": "조선시대 왕과 왕비의 신주를 모신 사당",
+                    "startX": 6,
+                    "startY": 6,
+                    "direction": "horizontal",
+                    "gradings": false
+                },
+                {
+                    "word": "고장난명",
+                    "hint": "한쪽 손뼉으로는 소리를 낼 수 없다는 말로 혼자서는 이룰 수 없다는 뜻의 사자성어",
+                    "startX": 0,
+                    "startY": 0,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "감언이설",
+                    "hint": "달콤한 말로 상대방을 현혹시켜 이익을 얻는다는 뜻의 사자성어",
+                    "startX": 2,
+                    "startY": 0,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "관포지교",
+                    "hint": "관중과 포숙아처럼 변하지 않는 두터운 우정을 뜻하는 사자성어",
+                    "startX": 7,
+                    "startY": 0,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "성동격서",
+                    "hint": "동쪽에서 소리지르고 서쪽에서 친다는 뜻으로 상대방을 속여 공략한다는 뜻의 사자성어",
+                    "startX": 4,
+                    "startY": 1,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "연목구어",
+                    "hint": "나무에서 물고기를 구한다는 말로 불가능한일을 고집한다는 뜻의 사자성어",
+                    "startX": 1,
+                    "startY": 3,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "유유상종",
+                    "hint": "같은 부류의 사람들끼리 모인다는 뜻의 사자성어",
+                    "startX": 6,
+                    "startY": 3,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "분토지언",
+                    "hint": "똥과 흙 같은 더럽고 이치에 맞지 않는 말을 의미하는 사자성어",
+                    "startX": 3,
+                    "startY": 4,
+                    "direction": "vertical",
+                    "gradings": false
+                },
+                {
+                    "word": "묘사",
+                    "hint": "어떤 대상을 그림이나 말로 자세하게 표현하는 것",
+                    "startX": 7,
+                    "startY": 6,
+                    "direction": "vertical",
+                    "gradings": false
+                }
     ]
 }
Add a comment
List