diff --git a/app/(game)/play/PlayClient.tsx b/app/(game)/play/PlayClient.tsx
index 6f87382..ca3db0c 100644
--- a/app/(game)/play/PlayClient.tsx
+++ b/app/(game)/play/PlayClient.tsx
@@ -6,6 +6,7 @@ import type { FormEvent } from "react";
import AnswerForm from "@/components/game/AnswerForm";
import FeedbackPanel from "@/components/game/FeedbackPanel";
import ScoreSummary from "@/components/game/ScoreSummary";
+import StageIndicator from "@/components/game/StageIndicator";
import KatexRenderer from "@/components/math/KatexRenderer";
import { useGameStore } from "@/store/gameStore";
@@ -115,9 +116,10 @@ export default function PlayClient() {
문제 풀이
-
- {session.currentIndex + 1} / {session.problems.length}
-
+
diff --git a/components/game/StageIndicator.tsx b/components/game/StageIndicator.tsx
new file mode 100644
index 0000000..b5b569d
--- /dev/null
+++ b/components/game/StageIndicator.tsx
@@ -0,0 +1,56 @@
+"use client";
+
+import type { GradeResult } from "@/lib/engine/types";
+
+interface StageIndicatorProps {
+ currentIndex: number;
+ results: (GradeResult | null)[];
+}
+
+export default function StageIndicator({
+ currentIndex,
+ results,
+}: StageIndicatorProps) {
+ return (
+
+ {results.map((result, index) => {
+ const stageNumber = index + 1;
+ const isCurrent = index === currentIndex;
+ const isCompleted = result !== null;
+
+ let label = `${stageNumber}번 남은 단계`;
+ let content = "";
+ let className =
+ "flex size-8 items-center justify-center rounded-full border text-sm font-bold leading-none transition";
+
+ if (isCompleted) {
+ label = result.correct
+ ? `${stageNumber}번 완료, 정답`
+ : `${stageNumber}번 완료, 오답`;
+ content = result.correct ? "✓" : "×";
+ className += result.correct
+ ? " border-emerald-700 bg-emerald-700 text-white"
+ : " border-red-700 bg-red-700 text-white";
+ } else if (isCurrent) {
+ label = `${stageNumber}번 현재 단계`;
+ content = String(stageNumber);
+ className +=
+ " border-emerald-700 bg-white text-emerald-800 shadow-sm ring-2 ring-emerald-200";
+ } else {
+ className += " border-slate-300 bg-white text-slate-300";
+ }
+
+ return (
+ -
+
+ {content || }
+
+
+ );
+ })}
+
+ );
+}