Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<!--
๐Ÿ“„ ๋ฌธ์ œ ํ’€์ด ํ…œํ”Œ๋ฆฟ
์ด ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด studies/week-XX/<๊นƒํ—ˆ๋ธŒID>/<๋ฌธ์ œ๋ฒˆํ˜ธ>-<๋ฌธ์ œ์ด๋ฆ„>.md ๋กœ ์ €์žฅํ•˜์„ธ์š”.
์•„๋ž˜ 5์š”์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ ‘๊ทผ/์‹œ๊ฐ„/๊ณต๊ฐ„/ํ•ต์‹ฌ/์ฝ”๋“œ)
-->

# [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(N log N) โ€” ์ •๋ ฌ O(N log N) + ์ˆœํšŒ O(N). ๊ทผ๊ฑฐ๋ฅผ ํ•จ๊ป˜ ์ ๊ธฐ. -->
<!-- SWEA๋Š” ์‹œ๊ฐ„ ์ œํ•œ์ด ๋นก๋นกํ•œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋”ฐ์ ธ๋ณผ ๊ฒƒ! -->
**์ผ€์ด์Šค๋‹น 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) โ€” ๋ฐฉ๋ฌธ ๋ฐฐ์—ด N๊ฐœ. -->
**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}")
```

---

### ๐Ÿง  ํšŒ๊ณ  (์„ ํƒ)
<!-- ๋ฐฐ์šด ์ , ๋น„์Šทํ•œ ์œ ํ˜•์—์„œ ์žฌ์‚ฌ์šฉํ•  ์•„์ด๋””์–ด, ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋ฌป๊ณ  ์‹ถ์€ ์  -->
* ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
* ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋๋‹ค.
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<!--
๐Ÿ“„ ๋ฌธ์ œ ํ’€์ด ํ…œํ”Œ๋ฆฟ
์ด ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด studies/week-XX/<๊นƒํ—ˆ๋ธŒID>/<๋ฌธ์ œ๋ฒˆํ˜ธ>-<๋ฌธ์ œ์ด๋ฆ„>.md ๋กœ ์ €์žฅํ•˜์„ธ์š”.
์•„๋ž˜ 5์š”์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ ‘๊ทผ/์‹œ๊ฐ„/๊ณต๊ฐ„/ํ•ต์‹ฌ/์ฝ”๋“œ)
-->

# [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 log N) โ€” ์ •๋ ฌ O(N log N) + ์ˆœํšŒ O(N). ๊ทผ๊ฑฐ๋ฅผ ํ•จ๊ป˜ ์ ๊ธฐ. -->
<!-- SWEA๋Š” ์‹œ๊ฐ„ ์ œํ•œ์ด ๋นก๋นกํ•œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋”ฐ์ ธ๋ณผ ๊ฒƒ! -->

**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) โ€” ๋ฐฉ๋ฌธ ๋ฐฐ์—ด N๊ฐœ. -->

**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 ์œ ํ˜•์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
134 changes: 134 additions & 0 deletions studies/week-02/clarityth/5656-๋ฒฝ๋Œ๊นจ๊ธฐ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<!--
๐Ÿ“„ ๋ฌธ์ œ ํ’€์ด ํ…œํ”Œ๋ฆฟ
์ด ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด studies/week-XX/<๊นƒํ—ˆ๋ธŒID>/<๋ฌธ์ œ๋ฒˆํ˜ธ>-<๋ฌธ์ œ์ด๋ฆ„>.md ๋กœ ์ €์žฅํ•˜์„ธ์š”.
์•„๋ž˜ 5์š”์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ ‘๊ทผ/์‹œ๊ฐ„/๊ณต๊ฐ„/ํ•ต์‹ฌ/์ฝ”๋“œ)
-->

# [SWEA 5656] [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ] ๋ฒฝ๋Œ ๊นจ๊ธฐ

| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|:---|:---|
| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo |
| ๐Ÿ“š ์ฃผ์ œ | ๊ตฌํ˜„, ์™„์ „ํƒ์ƒ‰(DFS), ๋ฐฑํŠธ๋ž˜ํ‚น |
| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | ๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ |
| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 1์‹œ๊ฐ„ |
| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์•„๋‹ˆ์˜ค |

---

## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ•
<!-- ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ–ˆ๊ณ , ์™œ ์ด ์ „๋žต์„ ํƒํ–ˆ๋Š”์ง€. ์ฒ˜์Œ ๋– ์˜ฌ๋ฆฐ ๋ฐฉ๋ฒ•๊ณผ ๋ง‰ํ˜”๋˜ ์ง€์ ๋„ ์ข‹์Œ. -->
* ๊ตฌ์Šฌ์„ $N$๋ฒˆ ๋–จ์–ด๋œจ๋ ค ๋งž์ถœ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์œ„์น˜(์—ด $W$๊ฐœ)์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ DFS ๋ฐฑํŠธ๋ž˜ํ‚น ํƒ์ƒ‰
* ๊ตฌ์Šฌ์„ ์  ์—ด(`col`)์„ ๊ฒฐ์ •ํ•˜๋ฉด, ํ•ด๋‹น ์—ด์—์„œ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฒฝ๋Œ์„ ํƒ€๊ฒฉํ•˜์—ฌ ์—ฐ์‡„ ํญ๋ฐœ ์ฒ˜๋ฆฌ
* ํญ๋ฐœ์ด ์™„๋ฃŒ๋œ ํ›„ ๋‚จ์•„์žˆ๋Š” ๋ฒฝ๋Œ๋“ค์„ ์•„๋ž˜๋กœ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์ค‘๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ
* ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋‚จ์•„์žˆ๋Š” ๋ฒฝ๋Œ ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜์—ฌ $N$๋ฒˆ ๊ตฌ์Šฌ์„ ๋ชจ๋‘ ์œ ๋’ค ๋‚จ์€ ๋ฒฝ๋Œ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ


## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„
<!-- ์˜ˆ: O(N log N) โ€” ์ •๋ ฌ O(N log N) + ์ˆœํšŒ O(N). ๊ทผ๊ฑฐ๋ฅผ ํ•จ๊ป˜ ์ ๊ธฐ. -->
<!-- SWEA๋Š” ์‹œ๊ฐ„ ์ œํ•œ์ด ๋นก๋นกํ•œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋”ฐ์ ธ๋ณผ ๊ฒƒ! -->

**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) โ€” ๋ฐฉ๋ฌธ ๋ฐฐ์—ด N๊ฐœ. -->

**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๋กœ ๊ฐ๊ฐ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ–ˆ๋‹ค.
* ์—ฐ์‡„ ํญ๋ฐœ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
Loading