·622 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/27421 ๋ฒ์ญ ๋ฌธ์ # Taro๋ ์ฅ๋๊ฐ ์ฒ ๋ ์ ๋ก ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ๋๊ณ ์์ต๋๋ค. ๋ชจ๋ ์ ๋ก๋ ์ง๊ฐ ์ค์ฌ๊ฐ(90๋ ๊ฐ๋)์ ๊ฐ์ง ํธ ๋ชจ์์ด์ง๋ง, ๋ฐ์ง๋ฆ์ ๋ค์ํฉ๋๋ค. Taro๋ ์ด ๋ชจ๋ ์ ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ๋ฃจํ๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ก ์ธํธ๊ฐ ํ๋์ ๋ฃจํ๋ฅผ ํ์ฑํ๋ค๋ ๊ฒ์ ๋ชจ๋ ์ ๋ก์ ์ ๋์ด ๋ค๋ฅธ ์ ๋ก์ ๋ถ๋๋ฝ๊ฒ ์ฐ๊ฒฐ๋๊ณ , ๋ชจ๋ ์ ๋ก๊ฐ ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์ ๋ก์ ์ฐ๊ฒฐ๋์ด ์์ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. Taro๊ฐ ์ด๊ฒ์ ๋ฌ์ฑํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ์ธ์.
·238 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/20929 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋ฌธ์ ์ ์ ํ์ธ $2^{19}$์ ํ์๋ฅผ ๋ณผ๋, ์ด๋ถ ํ์์ ์ฅ๋ คํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค. ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์๊ฐํด๋ณด์. ![[Drawing 2026-02-10 14.25.24.excalidraw.png]] ๊ธธ์ด 8์ ๋ฐฐ์ด 2๊ฐ์์ ๋ค์๊ณผ ๊ฐ์ด $N/2$๋ฒ์งธ ์์ธ 4๋ฒ์งธ ์๋ฅผ ๋น๊ตํ์ ๋, ์์ ๊ฐ์ด ์์ ๋ฐฐ์ด์ ์๋ ์ ๋ฐ๊ณผ ํฐ ๋ฐฐ์ด์ ์์ชฝ ์ ๋ฐ์ ๊ณ ๋ คํ ํ์๊ฐ ์์ด์ง๋ค. ![[Drawing 2026-02-10 14.31.00.excalidraw.png]] ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์์์ ์์ ๋ฐฐ์ด ์ชฝ 4๊ฐ๋ฅผ ์ ์ธํ๊ณ ๋ณด๋ฉด $N$์ด ์ ๋ฐ์ผ๋ก ์ค์ด๋ ์ํฉ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐ๋ณตํ ์ ์์์ ์ ์ ์๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ ๊ณผ์ ์ 1๊ฐ๊ฐ ๋จ์๋๊น์ง ๋ฐ๋ณตํ๋ฉด ๋ ๊ฐ์ ๊ฐ๊ฐ $N, N+1$๋ฒ์งธ ๊ฐ์ผ ๊ฒ์ด๋ค. ๋ฌธ์ ์์๋ $N$๋ฒ์งธ ์๋ฅผ ์๊ตฌํ์ผ๋ฏ๋ก, ๋ ์์ ์๋ฅผ ์ถ๋ ฅํ์. ๐ป ํ์ด # ์ฝ๋ (python): def Query(s, idx): """ ์ง๋ฌธ "? s idx"์ ํ๊ณ ์
๋ ฅ๋ฐ๋ ํจ์ """ print("?", s, idx) return int(input()) N = int(input()) A_Lidx = 1 A_Ridx = N # [A_Lidx ~ A_Ridx] ์ ์ ๋ต ํ๋ณด๊ฐ ์์ B_Lidx = 1 B_Ridx = N # [B_Lidx ~ B_Ridx] ์ ์ ๋ต ํ๋ณด๊ฐ ์์ while A_Ridx > A_Lidx: A_mid = (A_Lidx + A_Ridx) // 2 B_mid = (B_Lidx + B_Ridx) // 2 A_ret = Query("A", A_mid) B_ret = Query("B", B_mid) if A_ret <= B_ret: A_Lidx = A_mid + 1 B_Ridx = B_mid else: A_Ridx = A_mid B_Lidx = B_mid + 1 A_ret = Query("A", A_Lidx) B_ret = Query("B", B_Lidx) print("!", min(A_ret, B_ret)) ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·719 words·4 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/18214 ๋ฒ์ญ ๋ฌธ์ ๋ฒ์ญ # Susan์ ์ํ ์ ๋ฆฌ๋ ์ํ์ง๋ง, ์ฌ๋ฌด์ค ์ฑ
์ ์ ๋ฆฌ๋ ์ ๋ชปํฉ๋๋ค.
Susan์ ๋ฐฉ๊ธ ์ผ๋ จ์ ๋ฌธ์๋ค์ ๋ํ ์๋ฅ ์์
์ ๋ง์ณค๊ณ , ๋ฌธ์๋ค์ ์ฌ์ ํ ์ฑ
์์ ์์ฌ ์์ต๋๋ค. ๋ฌธ์๋ค์ ์ผ๋ จ๋ฒํธ๊ฐ ์์ผ๋ฉฐ, ์์ฌ๊ฐ ๊ฐ์ ธ์์ ๋๋ ์์๋๋ก ์์ฌ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ์์๊ฐ ์๋ฒฝํ์ง ์์๋ฐ, Susan์ด ๋๋ฌด ๊ฒ์๋ฌ์ ๋๋ฏธ์์ ๋น ์ ธ๋์จ ๋ฌธ์๋ค์ ์ ์๋ฆฌ์ ๋ค์ ๋ฃ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ์์
์ด ๋๋ฌ๋ค๋ ์์์ ๋ฃ๊ณ , ์์ฌ๋ ๊ทธ๋
์๊ฒ ๋ณด๋ด๊ณ ์๋ ๋ฌธ์ ์์์ ๋ฌธ์๋ค์ ์ฆ์ ๋ฐ๋ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฌผ๋ก ๋ฌธ์๋ค์ ์ผ๋ จ๋ฒํธ ์์๋๋ก ์์์ ๋ณด๊ด๋์ด์ผ ํฉ๋๋ค.
·151 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1300 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋์ด๋ธํ๊ฒ ๊ณ์ฐํ๋ค๋ฉด, ์ ์๊ฐ $10^{10}$๊ฐ ์์ผ๋ ์๋ฌด๊ฒ๋ ์๋๋ค. ์ฌ์ง์ด ์ ์ฅ๋ ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ค ์ $X$๊ฐ ์ฃผ์ด์ง ๋, $X$๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๊ฐ ๋ช๊ฐ์ธ์ง๋ $O(N)$์ ์
์ ์๋ค. ๊ทธ๋ฆฌ๊ณ $X$๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๊ฐ $K$๊ฐ ์ด์์ธ ์์ค ๊ฐ์ฅ ์์ $X$๊ฐ ์ ๋ต์ด๋ค. ๋ฐ๋ผ์ ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ฅผ ์ด์ฉํด $O(N\log{10^9})$์ ๋์ ๊ณ์ฐํ์. ๐ป ํ์ด # ์ฝ๋ (python): N = int(input()) K = int(input()) def count(X): # ๋ฐฐ์ด์์ X ์ดํ ์์ ๊ฐ์ result = 0 for i in range(1, N+1): result += min(N, X // i) return result ok = N*N ng = 0 # ๋ต์ ๋ฒ์๋ [1, N*N]์ด๋ฏ๋ก while ok - ng > 1: mid = (ok + ng) // 2 if count(mid) >= K: ok = mid else: ng = mid print(ok) ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·724 words·4 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31760 ๋ฒ์ญ ๋ฌธ์ # Apolyanka์ Bรผdelsdorf๋ ์ต๊ทผ ์ ์ดํ๊ฒ ๋ ๋ ๊ฐ์ ์์ ์ ์๊ธฐ ์๋ ๋ง์์
๋๋ค. $1$๋ถํฐ $N$๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง $N$๊ฐ์ ์์์ด ์์ผ๋ฉฐ, ๊ฐ ๋ง์์ ์๋ก ๋ค๋ฅธ ํจ์จ์ฑ์ ๊ฐ์ง๊ณ ์ด๋ค ์์์ ๋
๋ฆฝ์ ์ผ๋ก ์์ฐํ ์ ์์ต๋๋ค. ์์ $i$๋ฅผ ํ ๋จ์ ์์ฐํ๊ธฐ ์ํด, Apolyanka๋ $A_i$ ์ธ์(person-hours)๊ฐ ํ์ํ๊ณ , Bรผdelsdorf๋ $B_i$ ์ธ์๊ฐ ํ์ํฉ๋๋ค. ํ์ฌ Apolyanka๋ ์ฃผ์ด์ง ๊ฐ ์๊ฐ ๊ธฐ๊ฐ์ ์์ $i$๋ฅผ $U_i$ ๋จ์ ์์ฐํ๊ณ ์์ผ๋ฉฐ, Bรผdelsdorf๋ $W_i$ ๋จ์๋ฅผ ์์ฐํ๊ณ ์์ต๋๋ค.
·493 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/26969 ๋ฒ์ญ ๋ฌธ์ ๋ฒ์ญ # Bessie๋ “์ ์ ์ ์ฒดํ: ๋คํ๋ฉํฐ๋ฆฌ"๋ฅผ ๋ณด๊ณ ์ถ์ง๋ง, ํผ์ ๊ฐ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ถํํ๋, ๊ทธ๋
์ ์น๊ตฌ๋ค์ ํจ๊ป ๊ฐ ๋งํผ ์ด์ ์ ์ด์ง ์์ต๋๋ค! ๋ฐ๋ผ์ Bessie๋ ์น๊ตฌ๋ค์ด ์ํ๊ด์ ํจ๊ป ๊ฐ๋๋ก ๋๋ฌผ์ ์ค์ผ ํฉ๋๋ค. ๊ทธ๋
๋ ๋ ๊ฐ์ง ๋๋ฌผ ์๋จ์ ๊ฐ์ง๊ณ ์์ต๋๋ค: ๋ฌด๋(mooney)์ ์์ด์คํฌ๋ฆผ ์ฝ์
๋๋ค.
·858 words·5 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/26857 ๋ฒ์ญ ๋ฌธ์ ๋ฒ์ญ # ๋ ํ์ Aldo์ Bondan์ COVID-19 ํฌ๋ฐ๋ฏน ์ํฉ์ด ์
ํ๋์ด ๋์๊ฐ ๋ค์ ๋ด์๋๋ฉด์ ์ง์ ๊ฐํ ์์ต๋๋ค. ๊ทธ๋ค์ ํ๊ธฐ๋ฅผ ๋ง์น๊ณ ๋ฐฉํ ์ค์ด์ง๋ง, ์ง ๋ฐ์ผ๋ก ๋๊ฐ ์ ์๋ค๋ฉด ๋ฌด์จ ๋ฐฉํ์ ์ฆ๊ธธ ์ ์์๊น์? ํ์ง๋ง ์ง๋ฃจํจ์ ์ฐฝ์์ฑ์ ๋ถ๋ฌ์ผ์ผํต๋๋ค. ๊ทธ๋ค์ ์ง๋ฃจํ ๋ฐฉํ ๋์ ์๋ก์ด ๊ฒ์์ ๋ง๋ค์์ต๋๋ค.
·233 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/13448 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ป๋ ์ ์๊ฐ $M_i - t * p_i$๊ฐ ์๋ $M_i$๋ผ๋ฉด, ๋จ์ํ ๋ฐฐ๋ญ๋ฌธ์ ์ผํ
๋ฐ.. ์ด๊ฑธ ์ํด์ $N$์ ๋ํ ๋นํธ๋ง์คํน์ ์ถ๊ฐํ๋๊ฑด ๋ฏธ์น์ง์ด๋ค ๊ทธ๋ฐ๋ฐ, ์ด๋ค ๋ฌธ์ ๋ค์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด, ๊ทธ ๋ฌธ์ ๋ค์ ๋ํด ์์๋ฅผ ์ ํ๋๊ฑด ๊ทธ๋ฆฌ๋ํ๊ฒ ๋์ง ์๋? ๋ฌธ์ $i, j$๊ฐ ์๋ค๊ณ ํ์. $i \rightarrow j$๋ก ํ๋ฉด $(M_i - t * P_i) + (M_j - (t + R_i)*P_j)$ ์ ์ ์ป๊ฒ ๋๊ณ $j -> i$๋ก ํ๋ฉด $(M_j - t*P_j) + (M_i - (t + R_j) * P_i)$ ์ ์ ์ป๊ฒ ๋๋ค. ์์์ ์๋ ์์ ๋นผ๋ฉด $P_i * R_j - P_j * R_i$ ์ด๊ณ , $i \rightarrow j$๊ฐ ์ด๋์ด๊ธฐ ์ํด์ ์ด๊ฒ ์์์ฌ์ผํ๋ฏ๋ก $\frac{P_i}{R_i} \geq \frac{P_j}{R_j}$๋ก ์ ๋ ฌํ๋ ๊ทธ๋ฆฌ๋ ์ ๋ต์ด ์ ํจํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ์์๋ก ๋
์ DP๋ฅผ ์ํํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N, T; cin >> N >> T; vector<Problem> Prob(N); rep(i, 0, N) cin >> Prob[i].M; rep(i, 0, N) cin >> Prob[i].P; rep(i, 0, N) cin >> Prob[i].R; sort(all(Prob), [](Problem &A, Problem &B){ return A.P * B.R > B.P * A.R; }); vector<ll> DP(T+1); for(auto [M, P, R]: Prob) rrep(t, 0, T+1){ if(t - R < 0) break; DP[t] = max(DP[t], DP[t - R] + (M - P*t)); } ll ans = 0; rep(i, 0, T+1) ans = max(ans, DP[i]); cout << ans; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·186 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31265 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ดํด๊ฐ ์กฐ๊ธ ์ด๋ ค์ด๋ฐ, ๊ฒฐ๊ตญ $N$๊ฐ์ ํ๋ จ ์ํฉ์์ $d$๊ฐ์ ํ๋ จ ๊ฐ์ด๋ฐ ํ๋๋ฅผ ๊ณ์ ๊ณ ๋ฅด๊ณ , ํ๋ จ ์๊ฐ์ ํฉ์ ์ต๋ํ ํ๊ณ ์ถ๋ค. ๋ฐฐ๋ญ ๋ฌธ์ ์ ๋น์ทํด๋ณด์ธ๋ค. $d$๊ฐ์ ์ ํ์ง๊ฐ $N$๋ฒ ์ฃผ์ด์ง๊ณ , ํ๋ จ์๊ฐ = ๋ฌด๊ฒ์ ํฉ์ ์ต๋ํ ํด์ผํ๋ค. ์ด? ๋์ด๋ธํ๊ฒ ํ๋ฉด ํฐ์ง๋? ๊ฐ ๋จ๊ณ๋ง๋ค ํด์ผํ๋ ์ฐ์ฐ๋์ $M * d_i$์ด๋ค. ์ด ์ฐ์ฐ๋์ $\sum\limits_{i = 1}^N M * d_i \leq 1000 M$ ์ด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค. ์๋!!!!!!!! ์ํ๋ ธ๋ ํ๋ค ๊ฐ ํ๋ จ ์ํฉ์์ ์ ์ด๋ ํ๋์ ํ๋ จ์ ๊ณจ๋ผ ํ๋ จ ๊ณํ์ ๋ฃ์ผ๋ ค๊ณ ํ๋ค. ํ ํ๋ จ์ ์ฌ๋ฌ๋ฒ ์ฐ์ง ์๊ฒ $M$์ ๋ํด ์ญ์์ผ๋ก ๋๋ฉด์, ์ ์ฒ๋ฆฌํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ cin >> N >> M; rep(i, 0, N){ cin >> D[i]; tv[i].resize(D[i]); } rep(i, 0, N) rep(j, 0, D[i]) cin >> tv[i][j]; knapsack[0][0] = true; rep(i, 1, N+1) for(auto t: tv[i-1]) rrep(j, 0, M+1) if(j - t >= 0 && (knapsack[i-1][j-t] || knapsack[i][j-t])) knapsack[i][j] = true; rrep(j, 0, M+1) if(knapsack[N][j]){ cout << j; return; } cout << -1; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·335 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30788 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋์นญ์ด๋์ ์ด๋ป๊ฒ ์ํ์ ์ผ๋ก ํํํ ์ ์์๊น?? ์ฌ์ด๊ฑฐ๋ถํฐ ํด๋ณด์. ์๋ ์ ์ด $(x, y)$์ ์์๋ค๋ฉด $90\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $(-x, y)$ $45\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $(y, x)$ $60\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $y = \sqrt{3}x$์ ๋์นญ์ธ๊ฑฐ๋๊น… ์๋ ์ด๊ฑฐ ๋๋ฌด ๊น๋ค๋ก์ด๋ฐ? ํ๋ ฌ์ฐ์ฐ์ ํ๊ธฐ ์ซ์๋ฐ.. ๊ฐ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด๋๊ฒ๋ ์ข๊ฒ ๋ค. ๊ทน์ขํ๊ณ์ฒ๋ผ, ์๋ ์ ์ด $0\degree$์ ์์๋ค๋ฉด $60\degree$์ ๋ํด ๋์นญ์ํค๋ฉด $120\degree$์ $120\degree$์ ๋ํด ๋์นญ์ํค๋ฉด $240\degree$์ ์ด๋ฐ ๋๋์ธ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ๋ค๋ฉด ์์ 1๋ฒ์ $0\degree \rightarrow 120\degree \rightarrow 330 \degree \rightarrow 60 \degree \rightarrow 0$ ์ธ๊ฑฐ ๊ฐ๋ค! $45\degree = 225\degree$๋ผ๊ณ ์๊ฐํ๊ณ , ๊ฐ๊น์ด ๊ณณ์ ์ฐพ์์ ๋๋ฐฐ๋ก ๋๊ธฐ๊ณ , 360์ผ๋ก ๋ชจ๋๋ฌ๋ฅผ ์ทจํ์. ์, ์ด์ ํ๋ฒ์ฉ ์จ์ 0๋๋ก ๋์์ค๋๊ฑธ ์ด๋ป๊ฒ ๋ง๋ค์ง? $15\degree$๋ก ๋ง๋ค ์ ์๋๊ฑด $30\degree$ $x\degree$๋ฅผ $a$์ ๋์นญ์ด๋์ํค๋ฉด $(2a - x) \degree$๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค! ์ด๊ฑธ ๋ $b$์ ๋์นญ์ด๋์ํค๋ฉด $(2b - (2a - x))\degree$ ์ธ๊ฑฐ๊ฐ๊ณ .. ๊ทธ๋ฌ๋ฉด ํ๋ง๋ก ๋ฐ๋์ด๊ฐ๋ฉด์ ๋ํด์ง๋๊น ๊ฒฐ๊ตญ ๋ชจ๋๋ฌ 360์ ๋ํด ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ํฉ์ ์ผ์ ํ๊ฒ ๋ง์ถ ์ ์๋์ง์ ๋ํ ๋ฌธ์ ๋ก ๋ฐ๋๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; if(N%2){ cout << "NO"; return; } int sum = 0; for(auto x: A) sum += x; sum %= 360; DP[0][0][0] = true; rep(i, 0, N) rrep(j, 0, N) rep(k, 0, 360) if(DP[i][j][k]){ int nxt = (k + A[i]*2) % 360; DP[i+1][j+1][nxt] = true; DP[i+1][j][k] = true; } if(DP[N][N/2][sum] || DP[N][N/2][(sum + 180) % 360]){ cout << "YES\n"; vector<bool> used(N); int ci = N, cj = N/2, cs = sum; if(!DP[N][N/2][sum]) cs = (sum + 180) % 360; while(cj){ int prv = (cs - A[ci-1]*2) % 360; if(prv < 0) prv += 360; if(DP[ci-1][cj - 1][prv]){ used[ci-1] = true; ci--; cj--; cs = prv; } else ci--; } vector<int> v1, v2; rep(i, 0, N){ if(used[i]) v1.push_back(i+1); else v2.push_back(i+1); } rep(i, 0, N/2){ cout << v1[i] << ' ' << v2[i] << ' '; } } else cout << "NO"; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ