- To get started, edit the page.tsx file.
+
+ {/* Navigation */}
+
+
+ {/* Hero Section */}
+
+
+
+ ๋ฌด๋ฃ๋ก ๋ด ์ฌ์ฃผ๋ฅผ ํ์ธํด๋ณด์ธ์
+
+
+
+ ๋์ ์ฌ์ฃผํ์๋ฅผ
+ ํ์ธํ์ธ์
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
+
+
+ ์๋
์์ผ์๋ฅผ ์
๋ ฅํ๋ฉด ๋ฌด๋ฃ๋ก ์ฌ์ฃผํ์, ์ด์ธ, ๊ถํฉ์ ํ์ธํ ์ ์์ต๋๋ค.
+ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋์ ์ด๋ช
์ ์์๋ณด์ธ์.
+
+ {/* Main Input Card */}
+
+ ์๋
์์ผ์ ์
๋ ฅ
+
+
+ {/* ์๋
์์ผ */}
+
+
+
+
+
+
+
+
+
+ {/* ํ์ด๋ ์๊ฐ */}
+
+
+
+
+
+ {/* ์๋ ฅ/์๋ ฅ ์ ํ */}
+
+
+
+
+
+
+
+
+ {/* ์ฑ๋ณ ์ ํ */}
+
+
+
+
+
+
+
+
+ {/* ์ ์ถ ๋ฒํผ */}
+
-
-
-
- Deploy Now
-
-
- Documentation
+
+
+ {/* Features Section */}
+
+
+
+ ๋ฌด์์ ํ์ธํ ์ ์๋์?
+ ๋ค์ํ ์ฌ์ฃผ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ํ์ธํ์ธ์
+
+
+
+ {/* Feature 1 */}
+
+ ๐
+ ์ฌ์ฃผํ์
+
+ ๋์ ์ฒ๊ฐ, ์ง์ง, ์ญ์ฑ, ์ญ์ด์ด์ฑ์ ํ์ธํ๊ณ ์ด๋ช
์ ํ๋ฆ์ ํ์
ํ์ธ์.
+
+
+
+ {/* Feature 2 */}
+
+ ๐
+ ์ค๋์ ์ด์ธ
+
+ ์ฌ์ฃผ๋ฅผ ํ์ธํ ํ ์ค๋ ํ๋ฃจ์ ์ด์ธ๋ฅผ ํ์ธํ๊ณ ํ์ด์ ๋ฐฉํฅ์ ์ฐพ์๋ณด์ธ์.
+
+
+
+ {/* Feature 3 */}
+
+ ๐
+ ๊ถํฉ
+
+ ๋ ์ฌ๋์ ์ฌ์ฃผ๋ฅผ ๋น๊ตํ์ฌ ๊ถํฉ์ ํ์ธํ์ธ์.
+
+
+
+
+
+
+ {/* CTA Section */}
+
+
+
+ ์ง๊ธ ๋ฐ๋ก ๋ด ์ฌ์ฃผ๋ฅผ ํ์ธํด๋ณด์ธ์
+
+
+ ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ ์ ํํ ์ฌ์ฃผ ์ ๋ณด๋ก ๋์ ์ด๋ช
์ ์์๋ณด์ธ์
+
+
+ ๋ฌด๋ฃ๋ก ์์ํ๊ธฐ
-
+
+
+ {/* Footer */}
+
);
}
diff --git a/app/result/page.tsx b/app/result/page.tsx
new file mode 100644
index 0000000..84a5421
--- /dev/null
+++ b/app/result/page.tsx
@@ -0,0 +1,260 @@
+import { calculateSaju } from '@/lib/saju-calculator';
+import Link from 'next/link';
+
+interface PageProps {
+ searchParams: Promise<{
+ year: string;
+ month: string;
+ day: string;
+ hour?: string;
+ gender: 'male' | 'female';
+ calendarType: 'solar' | 'lunar';
+ }>;
+}
+
+export default async function ResultPage({ searchParams }: PageProps) {
+ const params = await searchParams;
+ const { year, month, day, hour, gender } = params;
+
+ const yearNum = parseInt(year);
+ const monthNum = parseInt(month);
+ const dayNum = parseInt(day);
+ const hourNum = hour ? parseInt(hour) : null;
+
+ const sajuData = calculateSaju(yearNum, monthNum, dayNum, hourNum, gender);
+
+ return (
+
+ {/* Navigation */}
+
+
+ {/* Result Content */}
+
+ {/* Header */}
+
+
+ ๋ด ์ฌ์ฃผํ์
+
+
+ {yearNum}๋
{monthNum}์ {dayNum}์ผ {hourNum !== null && `${hourNum}์`}
+ {gender === 'male' ? ' ๋จ์ฑ' : ' ์ฌ์ฑ'}
+
+
+
+ {/* ์ฌ์ฃผํ์ ํ */}
+
+ ์ฌ์ฃผํ์ (ๅๆฑๅ
ซๅญ)
+
+
+
+
+
+ ๊ตฌ๋ถ
+ {sajuData.hour && ์์ฃผ (ๆๆฑ) }
+ ์ผ์ฃผ (ๆฅๆฑ)
+ ์์ฃผ (ๆๆฑ)
+ ๋
์ฃผ (ๅนดๆฑ)
+
+
+
+ {/* ์ฒ๊ฐ */}
+
+ ์ฒ๊ฐ (ๅคฉๅนฒ)
+ {sajuData.hour && (
+
+ {sajuData.hour.stem}
+ {sajuData.hour.stemKr}
+
+ )}
+
+ {sajuData.day.stem}
+ {sajuData.day.stemKr}
+ ์ผ๊ฐ (ๆฅๅนฒ)
+
+
+ {sajuData.month.stem}
+ {sajuData.month.stemKr}
+
+
+ {sajuData.year.stem}
+ {sajuData.year.stemKr}
+
+
+
+ {/* ์ง์ง */}
+
+ ์ง์ง (ๅฐๆฏ)
+ {sajuData.hour && (
+
+ {sajuData.hour.branch}
+ {sajuData.hour.branchKr}
+
+ )}
+
+ {sajuData.day.branch}
+ {sajuData.day.branchKr}
+
+
+ {sajuData.month.branch}
+ {sajuData.month.branchKr}
+
+
+ {sajuData.year.branch}
+ {sajuData.year.branchKr}
+
+
+
+ {/* ์ญ์ฑ */}
+
+ ์ญ์ฑ (ๅๆ)
+ {sajuData.hour && (
+
+ {sajuData.hour.tenGod}
+
+ )}
+
+ {sajuData.day.tenGod}
+
+
+ {sajuData.month.tenGod}
+
+
+ {sajuData.year.tenGod}
+
+
+
+ {/* ์ญ์ด์ด์ฑ */}
+
+ ์ญ์ด์ด์ฑ
+ {sajuData.hour && (
+
+ {sajuData.hour.fortune}
+
+ )}
+
+ {sajuData.day.fortune}
+
+
+ {sajuData.month.fortune}
+
+
+ {sajuData.year.fortune}
+
+
+
+
+
+
+
+
+ ์ผ๊ฐ (ๆฅๅนฒ): {sajuData.day.stem}({sajuData.day.stemKr}) - ๋ ์์ ์ ๋ํ๋ด๋ ์ค์ฌ ๊ธฐ๋ฅ์
๋๋ค.
+
+
+
+
+ {/* ์ฌ์ฃผ ํด์ */}
+
+ {/* ์ฑ๊ฒฉ */}
+
+
+ ๐ค
+ ์ฑ๊ฒฉ ํน์ง
+
+
+
+ ์ผ๊ฐ์ด {sajuData.day.stem}({sajuData.day.stemKr})์ธ ์ฌ๋์
+ {sajuData.day.element === 'ๆจ' && ' ๋๋ฌด์ฒ๋ผ ์ฑ์ฅํ๊ณ ๋ฐ์ ํ๋ ค๋ ์์ง๊ฐ ๊ฐํฉ๋๋ค. ์ฐฝ์์ ์ด๊ณ ์ง์ทจ์ ์ธ ์ฑํฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.'}
+ {sajuData.day.element === '็ซ' && ' ๋ถ์ฒ๋ผ ์ด์ ์ ์ด๊ณ ํ๋์ ์
๋๋ค. ๋ฆฌ๋์ญ์ด ์๊ณ ์ฌ๊ต์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.'}
+ {sajuData.day.element === 'ๅ' && ' ํ์ฒ๋ผ ์์ ์ ์ด๊ณ ์ ๋ขฐ๊ฐ ์์ต๋๋ค. ํฌ์ฉ๋ ฅ์ด ์๊ณ ์ฑ
์๊ฐ์ด ๊ฐํฉ๋๋ค.'}
+ {sajuData.day.element === '้' && ' ๊ธ์์ฒ๋ผ ๊ฐ์ธํ๊ณ ์์น์ ์
๋๋ค. ๊ฒฐ๋จ๋ ฅ ์๊ณ ์๋ฆฌ๋ฅผ ์ค์ํฉ๋๋ค.'}
+ {sajuData.day.element === 'ๆฐด' && ' ๋ฌผ์ฒ๋ผ ์ ์ฐํ๊ณ ์งํ๋กญ์ต๋๋ค. ์ ์๋ ฅ์ด ๋ฐ์ด๋๊ณ ์ฌ๋ ค ๊น์ต๋๋ค.'}
+
+
+
+
+ {/* ์ด์ธ */}
+
+
+ ๐
+ ์ด์ธ ํ๋ฆ
+
+
+
+ ํ์ฌ ์ญ์ด์ด์ฑ์ด {sajuData.day.fortune}์ผ๋ก,
+ {sajuData.day.fortune === '์ฅ์' && ' ์๋ก์ด ์์๊ณผ ์ฑ์ฅ์ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '๋ชฉ์' && ' ์ ํ์ ์ค๋น์ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '๊ด๋' && ' ์ฌํ์ ์ผ๋ก ์ธ์ ๋ฐ๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '๊ฑด๋ก' && ' ์์ ๋๊ณ ์์ฑํ ํ๋์ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '์ ์' && ' ์ต๊ณ ์ ์ ์ฑ๊ธฐ๋ฅผ ๋ง์ดํ๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '์ ' && ' ์กฐ๊ธ์ฉ ํ์ด ์ฝํด์ง๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '๋ณ' && ' ์ด๋ ค์์ด ์์ ์ ์๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '์ฌ' && ' ๋๊ณผ ์ ์์์ ์ค๋นํ๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '๋ฌ' && ' ์ ์ ํด์์ด ํ์ํ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '์ ' && ' ๊ทน๋ณต๊ณผ ์ธ๋ด๊ฐ ํ์ํ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === 'ํ' && ' ์๋ก์ด ๊ธฐ์ด์ด ์นํธ๋ ์๊ธฐ์
๋๋ค.'}
+ {sajuData.day.fortune === '์' && ' ์ฑ์ฅ์ ์ค๋นํ๋ ์๊ธฐ์
๋๋ค.'}
+
+
+
+
+
+ {/* ์ถ๊ฐ ๊ธฐ๋ฅ ๋ฒํผ */}
+
+
+ ๐
+ ์ค๋์ ์ด์ธ
+ ์ค๋์ ์ด์ ํ์ธํ๊ธฐ
+
+
+
+ ๐
+ ๊ถํฉ ๋ณด๊ธฐ
+ ๋ ์ฌ๋์ ๊ถํฉ ํ์ธ
+
+
+
+
+
+
+ {/* Footer */}
+
+
+ );
+}
diff --git a/lib/saju-calculator.ts b/lib/saju-calculator.ts
new file mode 100644
index 0000000..322bbe5
--- /dev/null
+++ b/lib/saju-calculator.ts
@@ -0,0 +1,269 @@
+// ์ฒ๊ฐ (ๅคฉๅนฒ) - 10๊ฐ
+export const HEAVENLY_STEMS = ['็ฒ', 'ไน', 'ไธ', 'ไธ', 'ๆ', 'ๅทฑ', 'ๅบ', '่พ', 'ๅฃฌ', '็ธ'] as const;
+export const HEAVENLY_STEMS_KR = ['๊ฐ', '์', '๋ณ', '์ ', '๋ฌด', '๊ธฐ', '๊ฒฝ', '์ ', '์', '๊ณ'] as const;
+
+// ์ง์ง (ๅฐๆฏ) - 12๊ฐ
+export const EARTHLY_BRANCHES = ['ๅญ', 'ไธ', 'ๅฏ
', 'ๅฏ', '่พฐ', 'ๅทณ', 'ๅ', 'ๆช', '็ณ', '้
', 'ๆ', 'ไบฅ'] as const;
+export const EARTHLY_BRANCHES_KR = ['์', '์ถ', '์ธ', '๋ฌ', '์ง', '์ฌ', '์ค', '๋ฏธ', '์ ', '์ ', '์ ', 'ํด'] as const;
+
+// ์คํ (ไบ่ก)
+export const FIVE_ELEMENTS = {
+ '็ฒ': 'ๆจ', 'ไน': 'ๆจ',
+ 'ไธ': '็ซ', 'ไธ': '็ซ',
+ 'ๆ': 'ๅ', 'ๅทฑ': 'ๅ',
+ 'ๅบ': '้', '่พ': '้',
+ 'ๅฃฌ': 'ๆฐด', '็ธ': 'ๆฐด',
+ 'ๅฏ
': 'ๆจ', 'ๅฏ': 'ๆจ',
+ 'ๅทณ': '็ซ', 'ๅ': '็ซ',
+ '่พฐ': 'ๅ', 'ๆ': 'ๅ', 'ไธ': 'ๅ', 'ๆช': 'ๅ',
+ '็ณ': '้', '้
': '้',
+ 'ๅญ': 'ๆฐด', 'ไบฅ': 'ๆฐด',
+} as const;
+
+export const FIVE_ELEMENTS_KR = {
+ 'ๆจ': '๋ชฉ', '็ซ': 'ํ', 'ๅ': 'ํ ', '้': '๊ธ', 'ๆฐด': '์'
+} as const;
+
+// ์ญ์ฑ (ๅๆ)
+export const TEN_GODS = {
+ same: { yang: '๋น๊ฒฌ', yin: '๊ฒ์ฌ' }, // ๊ฐ์ ์คํ
+ produce: { yang: '์์ ', yin: '์๊ด' }, // ๋ด๊ฐ ์ํ๋ ์คํ
+ overcome: { yang: 'ํธ์ฌ', yin: '์ ์ฌ' }, // ๋ด๊ฐ ๊ทนํ๋ ์คํ
+ overcome_me: { yang: 'ํธ๊ด', yin: '์ ๊ด' }, // ๋๋ฅผ ๊ทนํ๋ ์คํ
+ produce_me: { yang: 'ํธ์ธ', yin: '์ ์ธ' } // ๋๋ฅผ ์ํ๋ ์คํ
+} as const;
+
+// ์ญ์ด์ด์ฑ (ๅไบ้ๆ)
+export const TWELVE_FORTUNES = [
+ '์ฅ์', '๋ชฉ์', '๊ด๋', '๊ฑด๋ก', '์ ์', '์ ', '๋ณ', '์ฌ', '๋ฌ', '์ ', 'ํ', '์'
+] as const;
+
+// ๊ฐ์ง ๊ณ์ฐ์ ์ํ ๊ธฐ์ค์ผ (1900๋
1์ 1์ผ = ๊ฒฝ์๋
์ ์ถ์ ๋ณ์ธ์ผ)
+const BASE_YEAR = 1900;
+const BASE_YEAR_STEM = 6; // ๅบ
+const BASE_YEAR_BRANCH = 0; // ๅญ
+
+/**
+ * ๋
๋์ ๊ฐ์ง๋ฅผ ๊ณ์ฐ
+ */
+export function getYearGanzi(year: number): { stem: string; branch: string; stemKr: string; branchKr: string } {
+ const yearDiff = year - BASE_YEAR;
+ const stemIndex = (BASE_YEAR_STEM + yearDiff) % 10;
+ const branchIndex = (BASE_YEAR_BRANCH + yearDiff) % 12;
+
+ return {
+ stem: HEAVENLY_STEMS[stemIndex],
+ branch: EARTHLY_BRANCHES[branchIndex],
+ stemKr: HEAVENLY_STEMS_KR[stemIndex],
+ branchKr: EARTHLY_BRANCHES_KR[branchIndex]
+ };
+}
+
+/**
+ * ์์ ๊ฐ์ง๋ฅผ ๊ณ์ฐ
+ */
+export function getMonthGanzi(year: number, month: number): { stem: string; branch: string; stemKr: string; branchKr: string } {
+ // ์ ์ง์ง๋ ๊ณ ์ : 1์=์ธ, 2์=๋ฌ, 3์=์ง, 4์=์ฌ, 5์=์ค, 6์=๋ฏธ...
+ // ๋จ, ์ ๊ธฐ ๊ธฐ์ค์ด์ง๋ง ๊ฐ๋จํ ์๋ก ๊ณ์ฐ
+ const branchIndex = (month + 1) % 12; // 1์=์ธ(2), 2์=๋ฌ(3)...
+
+ // ์ ์ฒ๊ฐ ๊ณ์ฐ (๋
๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง)
+ const yearStem = getYearGanzi(year).stem;
+ const yearStemIndex = HEAVENLY_STEMS.indexOf(yearStem as any);
+
+ // ์ ์ฒ๊ฐ ๊ณต์: (๋
๊ฐ * 2 + ์) % 10
+ const stemIndex = (yearStemIndex * 2 + month) % 10;
+
+ return {
+ stem: HEAVENLY_STEMS[stemIndex],
+ branch: EARTHLY_BRANCHES[branchIndex],
+ stemKr: HEAVENLY_STEMS_KR[stemIndex],
+ branchKr: EARTHLY_BRANCHES_KR[branchIndex]
+ };
+}
+
+/**
+ * ์ผ์ ๊ฐ์ง๋ฅผ ๊ณ์ฐ (๋ง์ธ๋ ฅ ๊ธฐ์ค)
+ */
+export function getDayGanzi(year: number, month: number, day: number): { stem: string; branch: string; stemKr: string; branchKr: string } {
+ // ๊ธฐ์ค์ผ (1900-01-01) ๋ถํฐ์ ์ผ์ ๊ณ์ฐ
+ const baseDate = new Date(1900, 0, 1);
+ const targetDate = new Date(year, month - 1, day);
+ const daysDiff = Math.floor((targetDate.getTime() - baseDate.getTime()) / (1000 * 60 * 60 * 24));
+
+ // 1900-01-01 = ไธๅฏ
์ผ
+ const baseDayStem = 2; // ไธ
+ const baseDayBranch = 2; // ๅฏ
+
+ const stemIndex = (baseDayStem + daysDiff) % 10;
+ const branchIndex = (baseDayBranch + daysDiff) % 12;
+
+ return {
+ stem: HEAVENLY_STEMS[stemIndex < 0 ? stemIndex + 10 : stemIndex],
+ branch: EARTHLY_BRANCHES[branchIndex < 0 ? branchIndex + 12 : branchIndex],
+ stemKr: HEAVENLY_STEMS_KR[stemIndex < 0 ? stemIndex + 10 : stemIndex],
+ branchKr: EARTHLY_BRANCHES_KR[branchIndex < 0 ? branchIndex + 12 : branchIndex]
+ };
+}
+
+/**
+ * ์์ ๊ฐ์ง๋ฅผ ๊ณ์ฐ
+ */
+export function getHourGanzi(dayGanzi: { stem: string }, hour: number): { stem: string; branch: string; stemKr: string; branchKr: string } {
+ // ์ ์ง์ง: ์์(23-01)=0, ์ถ์(01-03)=1, ...
+ let branchIndex: number;
+
+ if (hour >= 23 || hour < 1) branchIndex = 0; // ๅญ
+ else if (hour >= 1 && hour < 3) branchIndex = 1; // ไธ
+ else if (hour >= 3 && hour < 5) branchIndex = 2; // ๅฏ
+ else if (hour >= 5 && hour < 7) branchIndex = 3; // ๅฏ
+ else if (hour >= 7 && hour < 9) branchIndex = 4; // ่พฐ
+ else if (hour >= 9 && hour < 11) branchIndex = 5; // ๅทณ
+ else if (hour >= 11 && hour < 13) branchIndex = 6; // ๅ
+ else if (hour >= 13 && hour < 15) branchIndex = 7; // ๆช
+ else if (hour >= 15 && hour < 17) branchIndex = 8; // ็ณ
+ else if (hour >= 17 && hour < 19) branchIndex = 9; // ้
+ else if (hour >= 19 && hour < 21) branchIndex = 10; // ๆ
+ else branchIndex = 11; // ไบฅ
+
+ // ์ ์ฒ๊ฐ ๊ณ์ฐ (์ผ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง)
+ const dayStemIndex = HEAVENLY_STEMS.indexOf(dayGanzi.stem as any);
+ const stemIndex = (dayStemIndex * 2 + branchIndex) % 10;
+
+ return {
+ stem: HEAVENLY_STEMS[stemIndex],
+ branch: EARTHLY_BRANCHES[branchIndex],
+ stemKr: HEAVENLY_STEMS_KR[stemIndex],
+ branchKr: EARTHLY_BRANCHES_KR[branchIndex]
+ };
+}
+
+/**
+ * ์ญ์ฑ ๊ณ์ฐ
+ */
+export function getTenGod(dayStem: string, targetStem: string, isYang: boolean): string {
+ const dayElement = FIVE_ELEMENTS[dayStem as keyof typeof FIVE_ELEMENTS];
+ const targetElement = FIVE_ELEMENTS[targetStem as keyof typeof FIVE_ELEMENTS];
+
+ // ๊ฐ์ ์คํ
+ if (dayElement === targetElement) {
+ return isYang ? '๋น๊ฒฌ' : '๊ฒ์ฌ';
+ }
+
+ // ์คํ ์์/์๊ทน ๊ด๊ณ ํ์ธ
+ const produceMap: { [key: string]: string } = {
+ 'ๆจ': '็ซ', '็ซ': 'ๅ', 'ๅ': '้', '้': 'ๆฐด', 'ๆฐด': 'ๆจ'
+ };
+ const overcomeMap: { [key: string]: string } = {
+ 'ๆจ': 'ๅ', '็ซ': '้', 'ๅ': 'ๆฐด', '้': 'ๆจ', 'ๆฐด': '็ซ'
+ };
+
+ // ๋ด๊ฐ ์ํ๋ ์คํ
+ if (produceMap[dayElement] === targetElement) {
+ return isYang ? '์์ ' : '์๊ด';
+ }
+
+ // ๋ด๊ฐ ๊ทนํ๋ ์คํ
+ if (overcomeMap[dayElement] === targetElement) {
+ return isYang ? 'ํธ์ฌ' : '์ ์ฌ';
+ }
+
+ // ๋๋ฅผ ๊ทนํ๋ ์คํ
+ if (overcomeMap[targetElement] === dayElement) {
+ return isYang ? 'ํธ๊ด' : '์ ๊ด';
+ }
+
+ // ๋๋ฅผ ์ํ๋ ์คํ
+ if (produceMap[targetElement] === dayElement) {
+ return isYang ? 'ํธ์ธ' : '์ ์ธ';
+ }
+
+ return '๋น๊ฒฌ';
+}
+
+/**
+ * ์ญ์ด์ด์ฑ ๊ณ์ฐ
+ */
+export function getTwelveFortune(dayStem: string, branch: string): string {
+ // ๊ฐ๋จํ ์ญ์ด์ด์ฑ ๊ณ์ฐ (์ค์ ๋ก๋ ๋ ๋ณต์กํจ)
+ const fortuneMap: { [key: string]: { [key: string]: number } } = {
+ '็ฒ': { 'ไบฅ': 11, 'ๅญ': 0, 'ไธ': 1, 'ๅฏ
': 2, 'ๅฏ': 3, '่พฐ': 4, 'ๅทณ': 5, 'ๅ': 6, 'ๆช': 7, '็ณ': 8, '้
': 9, 'ๆ': 10 },
+ 'ไน': { 'ๅ': 11, 'ๆช': 0, '็ณ': 1, '้
': 2, 'ๆ': 3, 'ไบฅ': 4, 'ๅญ': 5, 'ไธ': 6, 'ๅฏ
': 7, 'ๅฏ': 8, '่พฐ': 9, 'ๅทณ': 10 },
+ 'ไธ': { 'ๅฏ
': 11, 'ๅฏ': 0, '่พฐ': 1, 'ๅทณ': 2, 'ๅ': 3, 'ๆช': 4, '็ณ': 5, '้
': 6, 'ๆ': 7, 'ไบฅ': 8, 'ๅญ': 9, 'ไธ': 10 },
+ 'ไธ': { '้
': 11, 'ๆ': 0, 'ไบฅ': 1, 'ๅญ': 2, 'ไธ': 3, 'ๅฏ
': 4, 'ๅฏ': 5, '่พฐ': 6, 'ๅทณ': 7, 'ๅ': 8, 'ๆช': 9, '็ณ': 10 },
+ 'ๆ': { 'ๅฏ
': 11, 'ๅฏ': 0, '่พฐ': 1, 'ๅทณ': 2, 'ๅ': 3, 'ๆช': 4, '็ณ': 5, '้
': 6, 'ๆ': 7, 'ไบฅ': 8, 'ๅญ': 9, 'ไธ': 10 },
+ 'ๅทฑ': { '้
': 11, 'ๆ': 0, 'ไบฅ': 1, 'ๅญ': 2, 'ไธ': 3, 'ๅฏ
': 4, 'ๅฏ': 5, '่พฐ': 6, 'ๅทณ': 7, 'ๅ': 8, 'ๆช': 9, '็ณ': 10 },
+ 'ๅบ': { 'ๅทณ': 11, 'ๅ': 0, 'ๆช': 1, '็ณ': 2, '้
': 3, 'ๆ': 4, 'ไบฅ': 5, 'ๅญ': 6, 'ไธ': 7, 'ๅฏ
': 8, 'ๅฏ': 9, '่พฐ': 10 },
+ '่พ': { 'ๅญ': 11, 'ไธ': 0, 'ๅฏ
': 1, 'ๅฏ': 2, '่พฐ': 3, 'ๅทณ': 4, 'ๅ': 5, 'ๆช': 6, '็ณ': 7, '้
': 8, 'ๆ': 9, 'ไบฅ': 10 },
+ 'ๅฃฌ': { '็ณ': 11, '้
': 0, 'ๆ': 1, 'ไบฅ': 2, 'ๅญ': 3, 'ไธ': 4, 'ๅฏ
': 5, 'ๅฏ': 6, '่พฐ': 7, 'ๅทณ': 8, 'ๅ': 9, 'ๆช': 10 },
+ '็ธ': { 'ๅฏ': 11, '่พฐ': 0, 'ๅทณ': 1, 'ๅ': 2, 'ๆช': 3, '็ณ': 4, '้
': 5, 'ๆ': 6, 'ไบฅ': 7, 'ๅญ': 8, 'ไธ': 9, 'ๅฏ
': 10 }
+ };
+
+ const index = fortuneMap[dayStem as keyof typeof fortuneMap]?.[branch as keyof typeof fortuneMap['็ฒ']] ?? 0;
+ return TWELVE_FORTUNES[index];
+}
+
+/**
+ * ์ฌ์ฃผํ์ ์ ์ฒด ๊ณ์ฐ
+ */
+export interface SajuData {
+ year: { stem: string; branch: string; stemKr: string; branchKr: string; element: string; tenGod: string; fortune: string };
+ month: { stem: string; branch: string; stemKr: string; branchKr: string; element: string; tenGod: string; fortune: string };
+ day: { stem: string; branch: string; stemKr: string; branchKr: string; element: string; tenGod: string; fortune: string };
+ hour?: { stem: string; branch: string; stemKr: string; branchKr: string; element: string; tenGod: string; fortune: string };
+ dayStem: string;
+ birthDate: { year: number; month: number; day: number; hour?: number };
+ gender: 'male' | 'female';
+}
+
+export function calculateSaju(
+ year: number,
+ month: number,
+ day: number,
+ hour: number | null,
+ gender: 'male' | 'female'
+): SajuData {
+ const yearGanzi = getYearGanzi(year);
+ const monthGanzi = getMonthGanzi(year, month);
+ const dayGanzi = getDayGanzi(year, month, day);
+ const hourGanzi = hour !== null ? getHourGanzi(dayGanzi, hour) : null;
+
+ const dayStem = dayGanzi.stem;
+ const dayStemIndex = HEAVENLY_STEMS.indexOf(dayStem as any);
+ const isDayYang = dayStemIndex % 2 === 0;
+
+ const result: SajuData = {
+ year: {
+ ...yearGanzi,
+ element: FIVE_ELEMENTS[yearGanzi.stem as keyof typeof FIVE_ELEMENTS],
+ tenGod: getTenGod(dayStem, yearGanzi.stem, HEAVENLY_STEMS.indexOf(yearGanzi.stem as any) % 2 === isDayYang ? true : false),
+ fortune: getTwelveFortune(dayStem, yearGanzi.branch)
+ },
+ month: {
+ ...monthGanzi,
+ element: FIVE_ELEMENTS[monthGanzi.stem as keyof typeof FIVE_ELEMENTS],
+ tenGod: getTenGod(dayStem, monthGanzi.stem, HEAVENLY_STEMS.indexOf(monthGanzi.stem as any) % 2 === isDayYang ? true : false),
+ fortune: getTwelveFortune(dayStem, monthGanzi.branch)
+ },
+ day: {
+ ...dayGanzi,
+ element: FIVE_ELEMENTS[dayGanzi.stem as keyof typeof FIVE_ELEMENTS],
+ tenGod: '์ผ๊ฐ',
+ fortune: getTwelveFortune(dayStem, dayGanzi.branch)
+ },
+ dayStem,
+ birthDate: { year, month, day, hour: hour ?? undefined },
+ gender
+ };
+
+ if (hourGanzi) {
+ result.hour = {
+ ...hourGanzi,
+ element: FIVE_ELEMENTS[hourGanzi.stem as keyof typeof FIVE_ELEMENTS],
+ tenGod: getTenGod(dayStem, hourGanzi.stem, HEAVENLY_STEMS.indexOf(hourGanzi.stem as any) % 2 === isDayYang ? true : false),
+ fortune: getTwelveFortune(dayStem, hourGanzi.branch)
+ };
+ }
+
+ return result;
+}
+ ๋์ ์ฌ์ฃผํ์๋ฅผ
+ ํ์ธํ์ธ์
- - Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. + +
+ ์๋ ์์ผ์๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฌด๋ฃ๋ก ์ฌ์ฃผํ์, ์ด์ธ, ๊ถํฉ์ ํ์ธํ ์ ์์ต๋๋ค. + ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋์ ์ด๋ช ์ ์์๋ณด์ธ์.
+ + {/* Main Input Card */} +์๋ ์์ผ์ ์ ๋ ฅ
+ +๋ฌด์์ ํ์ธํ ์ ์๋์?
+๋ค์ํ ์ฌ์ฃผ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ํ์ธํ์ธ์
+์ฌ์ฃผํ์
++ ๋์ ์ฒ๊ฐ, ์ง์ง, ์ญ์ฑ, ์ญ์ด์ด์ฑ์ ํ์ธํ๊ณ ์ด๋ช ์ ํ๋ฆ์ ํ์ ํ์ธ์. +
+์ค๋์ ์ด์ธ
++ ์ฌ์ฃผ๋ฅผ ํ์ธํ ํ ์ค๋ ํ๋ฃจ์ ์ด์ธ๋ฅผ ํ์ธํ๊ณ ํ์ด์ ๋ฐฉํฅ์ ์ฐพ์๋ณด์ธ์. +
+๊ถํฉ
++ ๋ ์ฌ๋์ ์ฌ์ฃผ๋ฅผ ๋น๊ตํ์ฌ ๊ถํฉ์ ํ์ธํ์ธ์. +
+ ++ ์ง๊ธ ๋ฐ๋ก ๋ด ์ฌ์ฃผ๋ฅผ ํ์ธํด๋ณด์ธ์ +
++ ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ ์ ํํ ์ฌ์ฃผ ์ ๋ณด๋ก ๋์ ์ด๋ช ์ ์์๋ณด์ธ์ +
+ + ๋ฌด๋ฃ๋ก ์์ํ๊ธฐ+ ๋ด ์ฌ์ฃผํ์ +
++ {yearNum}๋ {monthNum}์ {dayNum}์ผ {hourNum !== null && `${hourNum}์`} + {gender === 'male' ? ' ๋จ์ฑ' : ' ์ฌ์ฑ'} +
+์ฌ์ฃผํ์ (ๅๆฑๅ ซๅญ)
+ +| ๊ตฌ๋ถ | + {sajuData.hour &&์์ฃผ (ๆๆฑ) | } +์ผ์ฃผ (ๆฅๆฑ) | +์์ฃผ (ๆๆฑ) | +๋ ์ฃผ (ๅนดๆฑ) | +
|---|---|---|---|---|
| ์ฒ๊ฐ (ๅคฉๅนฒ) | + {sajuData.hour && ( +
+ {sajuData.hour.stem}
+ {sajuData.hour.stemKr}
+ |
+ )}
+
+ {sajuData.day.stem}
+ {sajuData.day.stemKr}
+ ์ผ๊ฐ (ๆฅๅนฒ)
+ |
+
+ {sajuData.month.stem}
+ {sajuData.month.stemKr}
+ |
+
+ {sajuData.year.stem}
+ {sajuData.year.stemKr}
+ |
+
| ์ง์ง (ๅฐๆฏ) | + {sajuData.hour && ( +
+ {sajuData.hour.branch}
+ {sajuData.hour.branchKr}
+ |
+ )}
+
+ {sajuData.day.branch}
+ {sajuData.day.branchKr}
+ |
+
+ {sajuData.month.branch}
+ {sajuData.month.branchKr}
+ |
+
+ {sajuData.year.branch}
+ {sajuData.year.branchKr}
+ |
+
| ์ญ์ฑ (ๅๆ) | + {sajuData.hour && ( +
+ {sajuData.hour.tenGod}
+ |
+ )}
+
+ {sajuData.day.tenGod}
+ |
+
+ {sajuData.month.tenGod}
+ |
+
+ {sajuData.year.tenGod}
+ |
+
| ์ญ์ด์ด์ฑ | + {sajuData.hour && ( +
+ {sajuData.hour.fortune}
+ |
+ )}
+
+ {sajuData.day.fortune}
+ |
+
+ {sajuData.month.fortune}
+ |
+
+ {sajuData.year.fortune}
+ |
+
+ ์ผ๊ฐ (ๆฅๅนฒ): {sajuData.day.stem}({sajuData.day.stemKr}) - ๋ ์์ ์ ๋ํ๋ด๋ ์ค์ฌ ๊ธฐ๋ฅ์ ๋๋ค. +
++ ๐ค + ์ฑ๊ฒฉ ํน์ง +
++ ์ผ๊ฐ์ด {sajuData.day.stem}({sajuData.day.stemKr})์ธ ์ฌ๋์ + {sajuData.day.element === 'ๆจ' && ' ๋๋ฌด์ฒ๋ผ ์ฑ์ฅํ๊ณ ๋ฐ์ ํ๋ ค๋ ์์ง๊ฐ ๊ฐํฉ๋๋ค. ์ฐฝ์์ ์ด๊ณ ์ง์ทจ์ ์ธ ์ฑํฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.'} + {sajuData.day.element === '็ซ' && ' ๋ถ์ฒ๋ผ ์ด์ ์ ์ด๊ณ ํ๋์ ์ ๋๋ค. ๋ฆฌ๋์ญ์ด ์๊ณ ์ฌ๊ต์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.'} + {sajuData.day.element === 'ๅ' && ' ํ์ฒ๋ผ ์์ ์ ์ด๊ณ ์ ๋ขฐ๊ฐ ์์ต๋๋ค. ํฌ์ฉ๋ ฅ์ด ์๊ณ ์ฑ ์๊ฐ์ด ๊ฐํฉ๋๋ค.'} + {sajuData.day.element === '้' && ' ๊ธ์์ฒ๋ผ ๊ฐ์ธํ๊ณ ์์น์ ์ ๋๋ค. ๊ฒฐ๋จ๋ ฅ ์๊ณ ์๋ฆฌ๋ฅผ ์ค์ํฉ๋๋ค.'} + {sajuData.day.element === 'ๆฐด' && ' ๋ฌผ์ฒ๋ผ ์ ์ฐํ๊ณ ์งํ๋กญ์ต๋๋ค. ์ ์๋ ฅ์ด ๋ฐ์ด๋๊ณ ์ฌ๋ ค ๊น์ต๋๋ค.'} +
++ ๐ + ์ด์ธ ํ๋ฆ +
++ ํ์ฌ ์ญ์ด์ด์ฑ์ด {sajuData.day.fortune}์ผ๋ก, + {sajuData.day.fortune === '์ฅ์' && ' ์๋ก์ด ์์๊ณผ ์ฑ์ฅ์ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '๋ชฉ์' && ' ์ ํ์ ์ค๋น์ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '๊ด๋' && ' ์ฌํ์ ์ผ๋ก ์ธ์ ๋ฐ๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '๊ฑด๋ก' && ' ์์ ๋๊ณ ์์ฑํ ํ๋์ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '์ ์' && ' ์ต๊ณ ์ ์ ์ฑ๊ธฐ๋ฅผ ๋ง์ดํ๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '์ ' && ' ์กฐ๊ธ์ฉ ํ์ด ์ฝํด์ง๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '๋ณ' && ' ์ด๋ ค์์ด ์์ ์ ์๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '์ฌ' && ' ๋๊ณผ ์ ์์์ ์ค๋นํ๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '๋ฌ' && ' ์ ์ ํด์์ด ํ์ํ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '์ ' && ' ๊ทน๋ณต๊ณผ ์ธ๋ด๊ฐ ํ์ํ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === 'ํ' && ' ์๋ก์ด ๊ธฐ์ด์ด ์นํธ๋ ์๊ธฐ์ ๋๋ค.'} + {sajuData.day.fortune === '์' && ' ์ฑ์ฅ์ ์ค๋นํ๋ ์๊ธฐ์ ๋๋ค.'} +
+์ค๋์ ์ด์ธ
+์ค๋์ ์ด์ ํ์ธํ๊ธฐ
+ + + +๊ถํฉ ๋ณด๊ธฐ
+๋ ์ฌ๋์ ๊ถํฉ ํ์ธ
+ + + +