diff --git "a/studies/week-02/clarityth/26070-\353\263\264\354\204\235\354\210\230\354\247\221\353\241\234\353\264\207.md" "b/studies/week-02/clarityth/26070-\353\263\264\354\204\235\354\210\230\354\247\221\353\241\234\353\264\207.md" new file mode 100644 index 0000000..995f05d --- /dev/null +++ "b/studies/week-02/clarityth/26070-\353\263\264\354\204\235\354\210\230\354\247\221\353\241\234\353\264\207.md" @@ -0,0 +1,127 @@ + + +# [SWEA 26070] [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ] ๋ณด์„ ์ˆ˜์ง‘ ๋กœ๋ด‡ + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +|:---|:---| +| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AZwmBfua3q3HBIT3 | +| ๐Ÿ“š ์ฃผ์ œ | ๋‹ค์ต์ŠคํŠธ๋ผ | +| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | ๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ | +| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 3์‹œ๊ฐ„ | +| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์•„๋‹ˆ์˜ค | + +--- + +## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ• + +* (0, 0)์—์„œ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ(โ†’)์œผ๋กœ ์ถœ๋ฐœํ•˜์—ฌ 1~M๋ฒˆ ๋ณด์„์„ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์†Œ ํšŒ์ „ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ +* ์œ„์น˜ ์™ธ์— ๋ฐฉํ–ฅ๊ณผ ๋ชฉํ‘œ ๋ณด์„ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•œ 4์ฐจ์› ์ƒํƒœ `(d, row, col, target_j)` ์ •์˜ +* ๋กœ๋ด‡์˜ ํ–‰๋™์„ **[๋ณด์„ ํš๋“]**, **[์ œ์ž๋ฆฌ ์šฐํšŒ์ „]**, **[์ง์ง„ ์ด๋™]** 3๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹ค์ต์ŠคํŠธ๋ผ(Priority Queue) ํƒ์ƒ‰ ์ ์šฉ + + +## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„ + + +**์ผ€์ด์Šค๋‹น O((V + E) log V) = O(Nยฒ ยท M ยท log(Nยฒ ยท M))** +* **์ƒํƒœ ์ˆ˜ (V)**: ์ตœ๋Œ€ $10 \times 10 \times 4 \times 10 = 4,000$๊ฐœ +* ์ƒํƒœ๋‹น ๊ฐ„์„ ์€ ์ตœ๋Œ€ 3๊ฐœ์ด๋ฏ€๋กœ `E โ‰ค 3V` +* ์ „์ฒด ์ž…๋ ฅ ๊ธฐ์ค€ ๋ณต์žก๋„๋Š” `O(T ยท Nยฒ ยท M ยท log(Nยฒ ยท M))` + +## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„ + +**O(Nยฒ ยท M)** โ€” +* `dist` ๋”•์…”๋„ˆ๋ฆฌ ๋ฐ `pq` ํž™ ์ €์žฅ ๊ณต๊ฐ„ ($O(N^2 \cdot M)$) + + +## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ + +1. **4์ฐจ์› ์ƒํƒœ ํ™•์žฅ**: + - `(d, row, col, target_j)` ํŠœํ”Œ ์ •์˜ ํ›„ `dist` ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์ตœ๋‹จ ํšŒ์ „์ˆ˜ ๊ธฐ๋ก +2. **๋™์ž‘์˜ ๋ถ„๋ฆฌ**: + - **๋ณด์„ ํš๋“**: `target_j + 1` ๊ฐฑ์‹  ํ›„ `continue` (ํšŒ์ „ +0) + - **์ œ์ž๋ฆฌ ์šฐํšŒ์ „**: `nd = (d + 1) % 4`, ์œ„์น˜ ์œ ์ง€ (ํšŒ์ „ +1) + - **์ง์ง„ ์ด๋™**: `row + dy[d], col + dx[d]` (ํšŒ์ „ +0) +3. **์‹œ๊ณ„ ๋ฐฉํ–ฅ ์˜คํ”„์…‹ ๋ฐฐ์—ด**: + - `dx = [1, 0, -1, 0]`, `dy = [0, 1, 0, -1]` (0:์šฐ, 1:ํ•˜, 2:์ขŒ, 3:์ƒ)๋กœ ์„ค์ •ํ•˜์—ฌ `(d + 1) % 4` ์šฐํšŒ์ „ ์ฒ˜๋ฆฌ + + +## 5. ์‹ค์ œ ์ฝ”๋“œ + + +```python +import heapq + +T = int(input()) + +# 0: ์šฐ, 1: ํ•˜, 2: ์ขŒ, 3: ์ƒ (์‹œ๊ณ„ ๋ฐฉํ–ฅ) +dx = [1, 0, -1, 0] +dy = [0, 1, 0, -1] + +for test_case in range(1, T + 1): + N = int(input()) + grid = [list(map(int, input().split())) for _ in range(N)] + + jewels = {} + j_idx = 1 + for i in range(N): + for j in range(N): + if grid[i][j] > 0: + jewels[grid[i][j]] = (i, j) + j_idx += 1 + + # dist[(๋ฐฉํ–ฅ, ํ–‰, ์—ด, ๋ชฉํ‘œ ๋ณด์„ ๋ฒˆํ˜ธ)] = ์ตœ์†Œ ํšŒ์ „ ํšŸ์ˆ˜ + dist = {} + dist[(0, 0, 0, 1)] = 0 + + ans = float("inf") + + # ํž™ ์›์†Œ: (ํšŒ์ „ ํšŸ์ˆ˜, ๋ฐฉํ–ฅ, ํ–‰, ์—ด, ๋ชฉํ‘œ ๋ณด์„ ๋ฒˆํ˜ธ) + pq = [(0, 0, 0, 0, 1)] + + while pq: + rotate, d, row, col, target_j = heapq.heappop(pq) + + # ๋” ์ ์€ ํšŒ์ „์ˆ˜๋กœ ๋ฐฉ๋ฌธํ•œ ์ƒํƒœ๋ฉด ์Šคํ‚ต + if rotate > dist.get((d, row, col, target_j), float("inf")): + continue + + # ๋ณด์„ ํš๋“ + if (row, col) == jewels.get(target_j): + next_target = target_j + 1 + + if next_target == j_idx: + ans = rotate + break + + # ๋ณด์„ ๋ฒˆํ˜ธ ์ฆ๊ฐ€ + if rotate < dist.get((d, row, col, next_target), float("inf")): + dist[(d, row, col, next_target)] = rotate + heapq.heappush(pq, (rotate, d, row, col, next_target)) + continue + + # ํšŒ์ „ + nd = (d + 1) % 4 + if (rotate + 1) < dist.get((nd, row, col, target_j), float("inf")): + dist[(nd, row, col, target_j)] = rotate + 1 + heapq.heappush(pq, (rotate + 1, nd, row, col, target_j)) + + # ์ง์ง„ + n_r, n_c = row + dy[d], col + dx[d] + if 0 <= n_r < N and 0 <= n_c < N: + if rotate < dist.get((d, n_r, n_c, target_j), float("inf")): + dist[(d, n_r, n_c, target_j)] = rotate + heapq.heappush(pq, (rotate, d, n_r, n_c, target_j)) + + print(f"#{test_case} {ans}") +``` + +--- + +### ๐Ÿง  ํšŒ๊ณ  (์„ ํƒ) + +* ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. +* ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋๋‹ค. diff --git "a/studies/week-02/clarityth/26071-\353\270\224\353\241\235\354\240\234\352\261\260\352\262\214\354\236\204.md" "b/studies/week-02/clarityth/26071-\353\270\224\353\241\235\354\240\234\352\261\260\352\262\214\354\236\204.md" new file mode 100644 index 0000000..e3c5586 --- /dev/null +++ "b/studies/week-02/clarityth/26071-\353\270\224\353\241\235\354\240\234\352\261\260\352\262\214\354\236\204.md" @@ -0,0 +1,113 @@ + + +# [SWEA 26071] ๋ธ”๋ก ์ œ๊ฑฐ ๊ฒŒ์ž„ + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +|:---|:---| +| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AZwmCVWq3uLHBIT3 | +| ๐Ÿ“š ์ฃผ์ œ | DP (๊ตฌ๊ฐ„ DP / Top-Down ๋ฉ”๋ชจ์ด์ œ์ด์…˜) | +| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | SWEA ๋ชจ์˜/D4 | +| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 3์‹œ๊ฐ„ | +| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์˜ˆ | + +--- + +## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ• + +* ์ฒ˜์Œ์—” permutations ์ด์šฉํ•ด ๋ธ”๋ก์„ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๋ คํ–ˆ์ง€๋งŒ, +* ์ˆœ์ฐจ์ ์œผ๋กœ ๋จผ์ € ์ œ๊ฑฐํ•  ๋ธ”๋ก์„ ๊ณ ๋ฅด๋ฉด ๋‚จ์€ ๋ธ”๋ก๋“ค์ด ์ธ์ ‘ํ•˜๊ฒŒ ๋ณ€ํ•ด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ $N!$๋กœ ํญ๋ฐœํ•˜๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง +* **์—ญ๋ฐœ์ƒ (๊ตฌ๊ฐ„ DP)**: ํŠน์ • ๊ตฌ๊ฐ„ `[start, end]`์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ œ๊ฑฐํ•  ๋ธ”๋ก $k$๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐ +* $k$๋ฒˆ์งธ ๋ธ”๋ก์ด ํ•ด๋‹น ๊ตฌ๊ฐ„์—์„œ ์ œ์ผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค๋ฉด, $k$์˜ ์ขŒ/์šฐ ์ด์›ƒ์€ ํ•ญ์ƒ ๊ตฌ๊ฐ„ ์™ธ๋ถ€์ธ `blocks[start - 1]`๊ณผ `blocks[end + 1]`๋กœ ๊ณ ์ • +* ๋”ฐ๋ผ์„œ `dp[start][end]`๋ฅผ `[start, end]` ๊ตฌ๊ฐ„์˜ ๋ธ”๋ก์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•  ๋•Œ ์–ป๋Š” ์ตœ๋Œ€ ์ ์ˆ˜๋กœ ์ •์˜ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Top-Down DP)์„ ์ ์šฉ + + +## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„ + + + +**O(Nยณ)** โ€” +* **๊ตฌ๊ฐ„ ์ƒํƒœ ๊ฐœ์ˆ˜**: $0 \le start \le end < N$ ์ธ ๊ตฌ๊ฐ„์˜ ๊ฐœ์ˆ˜ $O(N^2)$. +* **์ „์ด(Transition) ์—ฐ์‚ฐ**: ๊ฐ ๊ตฌ๊ฐ„๋งˆ๋‹ค $k$๋ฅผ $start \sim end$ ๋ฒ”์œ„๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ $O(N)$๋ฒˆ ๋น„๊ต +* **์ด ์‹œ๊ฐ„ ๋ณต์žก๋„**: $O(N^2) \times O(N) = O(N^3)$ (N <= 10) + + +## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„ + + +**O(Nยฒ)** โ€” +* `dp[N][N]` 2์ฐจ์› ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฐ์—ด ์ƒ์„ฑ $O(N^2)$ +* ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด ์ตœ๋Œ€ $O(N)$ + + +## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ + +1. **๋งˆ์ง€๋ง‰์— ์ œ๊ฑฐ๋  ๋ธ”๋ก ๊ธฐ์ค€์˜ ๊ตฌ๊ฐ„ DP (Interval DP)**: + - "์ฒซ ๋ฒˆ์งธ๋กœ ๊นฐ ๋ธ”๋ก"์„ ๊ณ ๋ฅด๋ฉด ๋‚จ์€ ์–‘์˜† ์š”์†Œ๊ฐ€ ๊ฐ€๋ณ€์ ์ด์ง€๋งŒ, "ํ•ด๋‹น ๊ตฌ๊ฐ„์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊นฐ ๋ธ”๋ก $k$"๋ฅผ ๊ณ ๋ฅด๋ฉด ์ขŒ์šฐ ์ด์›ƒ์ด ๊ณ ์ •๋˜์–ด ์ขŒ์ธก ๊ตฌ๊ฐ„ `[start, k-1]`๊ณผ ์šฐ์ธก ๊ตฌ๊ฐ„ `[k+1, end]`๋กœ ๋ถ„ํ•  ๊ฐ€๋Šฅ +2. **๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ (`left_val`, `right_val`)**: + - $k$๊ฐ€ ๋งจ ๋งˆ์ง€๋ง‰์— ๊นจ์งˆ ๋•Œ ์ด์›ƒ ๋ธ”๋ก์€ `start - 1`๊ณผ `end + 1` ์œ„์น˜ + - ๊ตฌ๊ฐ„์ด ๋ฐฐ์—ด ์–‘ ๋ ๊ฒฝ๊ณ„ ๋ฐ–์ธ ๊ฒฝ์šฐ(-1) ์˜ˆ์™ธ ์ฒ˜๋ฆฌ +3. **Top-Down ๋ฉ”๋ชจ์ด์ œ์ด์…˜**: + - `dp[start][end]`์— ๊ณ„์‚ฐ๋œ ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅ + + +## 5. ์‹ค์ œ ์ฝ”๋“œ + + +```python + +T = int(input()) + +for test_case in range(1, T+1): + N = int(input()) + blocks = list(map(int, input().split())) + + if N == 1: + print(f"#{test_case} {blocks[0]}") + continue + + dp = [[-1] * N for _ in range(N)] + + def get_max_score(start, end): + if start > end: + return 0 + + # DP ๋ฉ”๋ชจ์ด์ œ์ด์…˜ + if dp[start][end] != -1: + return dp[start][end] + + max_val = -float('inf') + + # [start, end] ๊ตฌ๊ฐ„์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊นจํŠธ๋ฆด ๋ธ”๋ก k ํƒ์ƒ‰ + for k in range(start, end+1): + left_val = blocks[start - 1] if start > 0 else -1 # ์ขŒ์ธก ์ด์›ƒ + right_val = blocks[end + 1] if end < N - 1 else -1 # ์šฐ์ธก ์ด์›ƒ + + if left_val == -1 and right_val > 0: # ์™ผ์ชฝ ๋์ผ ๊ฒฝ์šฐ + score = right_val + elif right_val == -1 and left_val > 0: # ์˜ค๋ฅธ์ชฝ ๋์ผ ๊ฒฝ์šฐ + score = left_val + elif left_val > 0 and right_val > 0: # ์ค‘๊ฐ„์ผ ๊ฒฝ์šฐ + score = left_val * right_val + elif left_val == -1 and right_val == -1: # ๋ธ”๋ก์ด ์˜ค์ง ํ•˜๋‚˜ ๋‚จ์€ ๊ฒฝ์šฐ + score = blocks[k] + + # top-down DP: ์ขŒ์ธก ๊ตฌ๊ฐ„ ์ตœ๋Œ“๊ฐ’ + ์šฐ์ธก ๊ตฌ๊ฐ„ ์ตœ๋Œ“๊ฐ’ + ํ•ด๋‹น ๋ธ”๋ก k๋ฅผ ๊นผ์„ ๋•Œ ์ ์ˆ˜ + val = get_max_score(start, k-1) + get_max_score(k+1, end) + score + max_val = max(max_val, val) + + dp[start][end] = max_val + return max_val + + print(f"#{test_case} {get_max_score(0, N-1)}") +``` + +--- + +### ๐Ÿง  ํšŒ๊ณ  (์„ ํƒ) + +* ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด๋‚ด๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์ด ์‰ฝ์ง€ ์•Š์•˜๋‹ค +* ๊ตฌ๊ฐ„ DP ์œ ํ˜•์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. \ No newline at end of file diff --git "a/studies/week-02/clarityth/5656-\353\262\275\353\217\214\352\271\250\352\270\260.md" "b/studies/week-02/clarityth/5656-\353\262\275\353\217\214\352\271\250\352\270\260.md" new file mode 100644 index 0000000..3e49df2 --- /dev/null +++ "b/studies/week-02/clarityth/5656-\353\262\275\353\217\214\352\271\250\352\270\260.md" @@ -0,0 +1,134 @@ + + +# [SWEA 5656] [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ] ๋ฒฝ๋Œ ๊นจ๊ธฐ + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +|:---|:---| +| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo | +| ๐Ÿ“š ์ฃผ์ œ | ๊ตฌํ˜„, ์™„์ „ํƒ์ƒ‰(DFS), ๋ฐฑํŠธ๋ž˜ํ‚น | +| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | ๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ | +| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 1์‹œ๊ฐ„ | +| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์•„๋‹ˆ์˜ค | + +--- + +## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ• + +* ๊ตฌ์Šฌ์„ $N$๋ฒˆ ๋–จ์–ด๋œจ๋ ค ๋งž์ถœ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์œ„์น˜(์—ด $W$๊ฐœ)์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ DFS ๋ฐฑํŠธ๋ž˜ํ‚น ํƒ์ƒ‰ +* ๊ตฌ์Šฌ์„ ์  ์—ด(`col`)์„ ๊ฒฐ์ •ํ•˜๋ฉด, ํ•ด๋‹น ์—ด์—์„œ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฒฝ๋Œ์„ ํƒ€๊ฒฉํ•˜์—ฌ ์—ฐ์‡„ ํญ๋ฐœ ์ฒ˜๋ฆฌ +* ํญ๋ฐœ์ด ์™„๋ฃŒ๋œ ํ›„ ๋‚จ์•„์žˆ๋Š” ๋ฒฝ๋Œ๋“ค์„ ์•„๋ž˜๋กœ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์ค‘๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ +* ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋‚จ์•„์žˆ๋Š” ๋ฒฝ๋Œ ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜์—ฌ $N$๋ฒˆ ๊ตฌ์Šฌ์„ ๋ชจ๋‘ ์œ ๋’ค ๋‚จ์€ ๋ฒฝ๋Œ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ + + +## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„ + + + +**O(W^N ยท H ยท W)** โ€” +* **๊ตฌ์Šฌ ํˆฌํ•˜ ๊ฒฝ์šฐ์˜ ์ˆ˜**: ์ด $N$๋ฒˆ ๊ตฌ์Šฌ์„ ์˜๋ฉฐ $W$๊ฐœ ์—ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ $W^N$๊ฐ€์ง€ ์ƒํƒœ ํƒ์ƒ‰. $W=12, N=4$์ผ ๋•Œ ์‹ค์ œ DFS ๊ฐ„์„  ์ˆ˜๋Š” $W + W^2 + W^3 + W^4 = 22,620$๊ฐœ. +* **๋‹จ๊ณ„๋ณ„ ์—ฐ์‚ฐ**: ๊ฐ ๊ฐ„์„ ๋งˆ๋‹ค ๋ณด๋“œ ๋ณต์‚ฌ, ํญ๋ฐœ(์ตœ๋Œ€ $H \times W$) ๋ฐ ์ค‘๋ ฅ ์ฒ˜๋ฆฌ($O(H \times W)$) ์ง„ํ–‰. + + +## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„ + + +**O(N ยท H ยท W)** โ€” +* **์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ**: DFS ๊นŠ์ด ์ตœ๋Œ€ $N$๊ฐœ. +* **๋ณด๋“œ ๋ณต์‚ฌ**: ๋งค ์žฌ๊ท€ ๋‹จ๊ณ„๋งˆ๋‹ค $H \times W$ํฌ๊ธฐ์˜ `next_board` deepcopy ($N \times H \times W$). + + +## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ + +1. **DFS ๋ฐฑํŠธ๋ž˜ํ‚น๊ณผ ๋งค ๋‹จ๊ณ„ ์ตœ์†Ÿ๊ฐ’ ๊ฐฑ์‹ **: + - `ans = min(ans, remain)`์„ DFS ์ฒซ ์ค„์— ๋ฐฐ์น˜ํ•˜์—ฌ ํ•ญ์ƒ ๊ฒฐ๊ณผ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ตœ์ดˆ ํ’€์ด์‹œ DFS์˜ depth๊ฐ€ N์ผ๋•Œ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์ž˜๋ชป ์„ค์ • +2. **์—ฐ์‡„ ํญ๋ฐœ ์ฒ˜๋ฆฌ**: + - ๋ฒฝ๋Œ์˜ ์ˆซ์ž K๋ฅผ ๋จผ์ € ๋”ฐ๋กœ ๋ณด๊ด€ํ•œ ๋’ค ํ•ด๋‹น ์œ„์น˜๋ฅผ `0`์œผ๋กœ ์ง€์šฐ๊ณ , ์ƒํ•˜์ขŒ์šฐ dx, dy์— ๋Œ€ํ•ด K-1 ๋ฒ”์œ„๋งŒํผ ์—ฐ์‡„ ํญ๋ฐœ์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ (BFS ํ๋กœ๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ) +3. **์ค‘๋ ฅ ์ •๋ ฌ**: + - ๊ฐ ์—ด์„ ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœํšŒํ•ด `0`์ด ์•„๋‹Œ ๋ฒฝ๋Œ์„ ๋ชจ์€ ํ›„, `pop()`์œผ๋กœ ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์ฑ„์›Œ ๋„ฃ์–ด ๋ฒฝ๋Œ์„ ์•„๋ž˜๋กœ ์ด๋™ +4. **๊ฐ€์ง€์น˜๊ธฐ**: + - `ans == 0`์ด ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋ฏธ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ“๊ฐ’์ด๋ฏ€๋กœ ์กฐ๊ธฐ ์ข…๋ฃŒ + + +## 5. ์‹ค์ œ ์ฝ”๋“œ + + +```python +T = int(input()) + +dx = [0, 0, -1, 1] +dy = [-1, 1, 0, 0] + +for test_case in range(1, T+1): + N, W, H = map(int, input().split()) + + board = [list(map(int, input().split())) for _ in range(H)] + + def get_brick_cnt(board): + cnt = 0 + for row in board: + for room in row: + if room > 0: + cnt += 1 + return cnt + + def boom(row, col, board): + power = board[row][col] + board[row][col] = 0 + cnt = 1 + + for p in range(1, power): + for i in range(4): + nr, nc = row + p * dy[i], col + p * dx[i] + if 0 <= nr < H and 0 <= nc < W: + if board[nr][nc] > 1: + cnt += boom(nr, nc, board) + board[nr][nc] = 0 + elif board[nr][nc] == 1: + board[nr][nc] = 0 + cnt += 1 + return cnt + + def gravity(board): + for col in range(W): + temp = [] + for row in range(H): + if board[row][col] > 0: + temp.append(board[row][col]) + board[row][col] = 0 + + row = H - 1 + while temp: + board[row][col] = temp.pop() + row -= 1 + + def dfs(depth, board, remain): + global ans + + ans = min(ans, remain) + + if depth == N or ans == 0: + return + + for col in range(W): + for row in range(H): + if board[row][col] > 0: + next_board = [r[:] for r in board] + crashed = boom(row, col, next_board) + gravity(next_board) + dfs(depth + 1, next_board, remain - crashed) + break + + ans = get_brick_cnt(board) + dfs(0, board, ans) + print(f"#{test_case} {ans}") +``` + +### ๐Ÿง  ํšŒ๊ณ  (์„ ํƒ) + +* ์ตœ์ดˆ ํ’€์ด์‹œ, product๋ฅผ ์ด์šฉํ•ด ํ’€์—ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ค ์ˆ˜์ •ํ–ˆ๋‹ค. +* dfs์˜ ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ board์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ deepcopy๋กœ ๊ฐ๊ฐ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ–ˆ๋‹ค. +* ์—ฐ์‡„ ํญ๋ฐœ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. diff --git "a/studies/week-02/clarityth/5658-\353\263\264\353\254\274\354\203\201\354\236\220\353\271\204\353\260\200\353\262\210\355\230\270.md" "b/studies/week-02/clarityth/5658-\353\263\264\353\254\274\354\203\201\354\236\220\353\271\204\353\260\200\353\262\210\355\230\270.md" new file mode 100644 index 0000000..2f606a7 --- /dev/null +++ "b/studies/week-02/clarityth/5658-\353\263\264\353\254\274\354\203\201\354\236\220\353\271\204\353\260\200\353\262\210\355\230\270.md" @@ -0,0 +1,87 @@ + + +# [SWEA 5658] [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ] ๋ณด๋ฌผ์ƒ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +|:---|:---| +| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo | +| ๐Ÿ“š ์ฃผ์ œ | ๊ตฌํ˜„, ๋ฌธ์ž์—ด | +| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | ๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ | +| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 30๋ถ„ | +| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์•„๋‹ˆ์˜ค | + +--- + +## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ• + +* ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฐ ๋ฌธ์ž์—ด ์กฐ์ž‘ ์œ ํ˜•์œผ๋กœ ํŒ๋‹จ +* ํ•œ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ $N/4$์ด๋ฏ€๋กœ $N/4$๋ฒˆ ํšŒ์ „ํ•˜๋ฉด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ˆ˜ ์กฐํ•ฉ ์ถ”์ถœ +* `set`์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ $K$๋ฒˆ์งธ ํฐ ์ˆ˜๋ฅผ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ + + +## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„ + + + +**์‹œ๊ฐ„ ๋ณต์žก๋„: O(Nยฒ log N)** โ€” +* **ํšŒ์ „ ๋ฐ ์ถ”์ถœ**: $N/4$ํšŒ ร— ๊ธธ์ด $N$ ์ฒ˜๋ฆฌ = $O(Nยฒ)$ +* **์ •๋ ฌ**: ๋ฌธ์ž์—ด ๋น„๊ต ๋น„์šฉ๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ์ตœ์•… $O(Nยฒ \log N)$ +* **10์ง„์ˆ˜ ๋ณ€ํ™˜**: ์„ ํƒ๋œ ๋ฌธ์ž์—ด ํ•˜๋‚˜๋งŒ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ $O(N)$ + +## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„ + + +**๊ณต๊ฐ„ ๋ณต์žก๋„: O(Nยฒ)** โ€” +* ์ตœ๋Œ€ $N$๊ฐœ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋ฉฐ ๊ฐ ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ $N/4$์ž„. + + +## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ + +* **ํšŒ์ „ ์ฃผ๊ธฐ์„ฑ**: $N/4$๋ฒˆ ํšŒ์ „ ์‹œ ๋ชจ๋“  16์ง„์ˆ˜ ์ˆ˜ ์ถ”์ถœ +* **`set` ํ™œ์šฉ**: ์ค‘๋ณต ์ œ๊ฑฐ +* **10์ง„์ˆ˜ ๋ณ€ํ™˜**: ์ž๋ฆฟ์ˆ˜๋ณ„ `16^p` ๊ณฑํ•˜์—ฌ ํ•ฉ์‚ฐ + + +## 5. ์‹ค์ œ ์ฝ”๋“œ + + +```python +T = int(input()) + +for test_case in range(1, T+1): + N, K = map(int, input().split()) + input_str = input() + + rotated_nums = set() + for i in range(N // 4): + rotate_str = (input_str[-i:] + input_str[:-i]) + for j in range(0, len(rotate_str), N // 4): + rotated_nums.add(rotate_str[j : j + N // 4]) + + sorted_rotated_nums = sorted(list(rotated_nums), reverse=True) + + def hex_to_decimal(hex_str): + ans = 0 + offset = 1 + for i in range(len(hex_str) - 1, -1, -1): + c = hex_str[i] + if c.isdigit(): + ans += int(c) * offset + elif c.isalpha(): + ans += ((ord(c) - ord('A')) + 10) * offset + offset *= 16 + return ans + + print(f"#{test_case} {hex_to_decimal(sorted_rotated_nums[K-1])}") +``` + +--- + +### ๐Ÿง  ํšŒ๊ณ  (์„ ํƒ) + +* `ord()` ๋ฐ ์ง„๋ฒ• ๋ณ€ํ™˜ ์›๋ฆฌ๋ฅผ ๋ณต์Šต +* ํŒŒ์ด์ฌ ๋‚ด์žฅํ•จ์ˆ˜ `int(str, 16)`์„ ์“ฐ๋ฉด ๋” ๊ฐ„๊ฒฐํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค.