Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# [SWEA 26070] ๋ณด์„ ์ˆ˜์ง‘ ๋กœ๋ด‡

| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|:---|:---|
| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AZwmBfua3q3HBIT3 |
| ๐Ÿ“š ์ฃผ์ œ | BFS, ๋‹ค์ต์ŠคํŠธ๋ผ |
| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | D4 |
| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 1H |
| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์˜ˆ |

---

## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ•

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿ“ Maintainability & Code Quality | ๐ŸŸก Minor | โšก Quick win

Markdown ์ œ๋ชฉ๊ณผ ์ฝ”๋“œ ํŽœ์Šค ๋’ค์— ๋นˆ ์ค„์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

markdownlint์˜ MD022/MD031 ๊ฒฝ๊ณ ๋Œ€๋กœ ๊ฐ ์ œ๋ชฉ ๋‹ค์Œ๊ณผ ์ฝ”๋“œ ํŽœ์Šค ์•ž๋’ค์— ๋นˆ ์ค„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ํŽœ์Šค์˜ python ์–ธ์–ด ํƒœ๊ทธ ์ž์ฒด๋Š” ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

Also applies to: 19-19, 23-23, 26-26, 33-34, 83-83

๐Ÿงฐ Tools
๐Ÿช› markdownlint-cli2 (0.23.1)

[warning] 13-13: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@studies/week-02/Suyoung-Min/26070_๋ณด์„์ˆ˜์ง‘๋กœ๋ด‡.md` at line 13, In the Markdown
document, add blank lines after each heading and immediately before and after
every fenced code block, including the sections referenced by the repeated
locations. Keep the existing python fence language tags unchanged and preserve
the code content.

Source: Linters/SAST tools

๋กœ๋ด‡์ด `(0,0)`์—์„œ ์˜ค๋ฅธ์ชฝ์„ ๋ณด๊ณ  ์ถœ๋ฐœํ•ด, **๋ณด์„์„ ๋ฒˆํ˜ธ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ** ํ•˜๋‚˜์”ฉ ๋ฐฉ๋ฌธํ•œ๋‹ค.
๋น„์šฉ์€ **ํšŒ์ „ ํšŸ์ˆ˜**๋ฟ โ€” ์ „์ง„์€ 0, 90ยฐ ํšŒ์ „์€ +1.
"๋ณด์„ ์‚ฌ์ด ๊ตฌ๊ฐ„๋งˆ๋‹ค ์ตœ์†Œ ํšŒ์ „ ์ˆ˜"๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ด ๋ˆ„์ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ,
๊ฐ ๊ตฌ๊ฐ„์„ **๋น„์šฉ์ด 0/1์ธ ์ตœ๋‹จ๊ฒฝ๋กœ(๋‹ค์ต์ŠคํŠธ๋ผ)** ๋กœ ํ‘ผ๋‹ค. ๋„์ฐฉ ์‹œ ์œ„์น˜ยท๋ฐฉํ–ฅ์„ ๋‹ค์Œ ๊ตฌ๊ฐ„์œผ๋กœ ๋„˜๊ธด๋‹ค.

## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„
**O(J ยท nยฒ log n)** โ€” J = ๋ณด์„ ์ˆ˜(์ตœ๋Œ€ ~nยฒ), ๊ตฌ๊ฐ„๋งˆ๋‹ค ์ƒํƒœ `(y,x,๋ฐฉํ–ฅ,ํšŒ์ „๊ฐ€๋Šฅ)` ๋‹ค์ต์ŠคํŠธ๋ผ.
์ „์ฒด์ ์œผ๋กœ๋Š” ๋Œ€๋žต `O(nโด log n)` ๊ทœ๋ชจ.

## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„
**O(nยฒ)** โ€” ๊ฒฉ์ž ์ €์žฅ ๋ฐ ํž™์— ์˜ฌ๋ผ๊ฐ€๋Š” ์ƒํƒœ ์ˆ˜(์œ„์น˜ร—๋ฐฉํ–ฅร—ํ”Œ๋ž˜๊ทธ = nยฒร—4ร—2).
Comment on lines +19 to +24

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿš€ Performance & Scalability | ๐ŸŸ  Major | โšก Quick win

visited/dist ์—†์ด ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‹คํ–‰ํ•ด ๋ฌธ์„œ์˜ ๋ณต์žก๋„๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” ๊ฐ™์€ (y, x, ๋ฐฉํ–ฅ, turn_flag) ์ƒํƒœ๋ฅผ ๋” ํฐ ๋น„์šฉ์˜ ๊ฒฝ๋กœ๋กœ๋„ ๊ณ„์† ํž™์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (0,1,์˜ค๋ฅธ์ชฝ,True)์—์„œ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ๋ฐ”ํ€ด ๋Œ๋ฉด ๊ฐ™์€ ์ƒํƒœ์— ๋‹ค์‹œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํž™ ์›์†Œ ์ˆ˜๊ฐ€ ์ƒํƒœ ์ˆ˜ O(nยฒ)๋กœ ์ œํ•œ๋˜์ง€ ์•Š์•„, ๋ฌธ์„œ์˜ O(Jยทnยฒ log n) ์‹œ๊ฐ„ ๋ฐ O(nยฒ) ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์‹ค์ œ ์ฝ”๋“œ์— ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ž…๋ ฅ์—์„œ๋Š” TLE ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ƒํƒœ๋ฅผ ์ฒ˜์Œ ๊บผ๋‚ผ ๋•Œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ dist๋กœ ์™„ํ™” ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด ๋ฌธ์ œ๋Š” 0/1 ๊ฐ€์ค‘์น˜์ด๋ฏ€๋กœ deque๋ฅผ ์ด์šฉํ•œ 0-1 BFS๋กœ ๋ฐ”๊พธ๋ฉด ๊ตฌ๊ฐ„๋‹น O(nยฒ)๊นŒ์ง€ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œ ์ˆ˜์ • ์˜ˆ์‹œ
         q = []
+        visited = [[[[False] * 2 for _ in range(4)]
+                    for _ in range(n)] for _ in range(n)]
         heapq.heappush(q, (0, sy, sx, cur_d, not first_flag))

         while q:
             cost, y, x, direct, turn_flag = heapq.heappop(q)
+            if visited[y][x][direct][turn_flag]:
+                continue
+            visited[y][x][direct][turn_flag] = True

๊ฒฝ๋กœ ์ง€์นจ์˜ โ€œ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์‹ค์ œ ์ฝ”๋“œ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์ง์ ‘ ๊ณ„์‚ฐโ€ ๋ฐ โ€œ์ž…๋ ฅ ์ตœ๋Œ€์น˜ ๊ธฐ์ค€ TLE ์œ„ํ—˜์„ ๋ฐ˜๋“œ์‹œ ์ง€์ โ€ ์š”๊ตฌ๋ฅผ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 55-76, 85-85

๐Ÿงฐ Tools
๐Ÿช› markdownlint-cli2 (0.23.1)

[warning] 19-19: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 23-23: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@studies/week-02/Suyoung-Min/26070_๋ณด์„์ˆ˜์ง‘๋กœ๋ด‡.md` around lines 19 - 24, ๋‹ค์ต์ŠคํŠธ๋ผ ์ƒํƒœ
ํƒ์ƒ‰์— `(y, x, ๋ฐฉํ–ฅ, turn_flag)`๋ณ„ `visited` ๋˜๋Š” `dist` ์™„ํ™” ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋™์ผ ์ƒํƒœ์˜ ๋” ํฐ ๋น„์šฉ ๊ฒฝ๋กœ๊ฐ€ ํž™์—
์ค‘๋ณต ์‚ฝ์ž…๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•˜์„ธ์š”. ๊ฐ ์ƒํƒœ๋ฅผ ์ฒ˜์Œ ๊บผ๋‚ผ ๋•Œ๋งŒ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋” ์งง์€ ๊ฑฐ๋ฆฌ์ผ ๋•Œ๋งŒ ๊ฐฑ์‹ ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•˜๋ฉด 0/1 ๊ฐ€์ค‘์น˜ ํŠน์„ฑ์— ๋งž์ถฐ
`deque` ๊ธฐ๋ฐ˜ 0-1 BFS๋กœ ๋ณ€๊ฒฝํ•ด ๊ตฌ๊ฐ„๋ณ„ ์‹œ๊ฐ„ยท๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋ฌธ์„œ์™€ ์ผ์น˜ํ•˜๋„๋ก ํ•˜์„ธ์š”.

Source: Path instructions


## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ
- **์ƒํƒœ๋ฅผ `(๋น„์šฉ, y, x, ๋ฐฉํ–ฅ, ํšŒ์ „๊ฐ€๋Šฅ์—ฌ๋ถ€)`** ๋กœ ์ •์˜ํ•ด ํž™์— ๋„ฃ๋Š”๋‹ค.
- **๋น„์šฉ = ํšŒ์ „ ์ˆ˜**: ์ „์ง„์€ `cost` ๊ทธ๋Œ€๋กœ, ํšŒ์ „์€ `cost+1`. โ†’ 0/1 ๊ฐ€์ค‘์น˜๋ผ ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ์„ฑ๋ฆฝ.
- **์—ฐ์† ํšŒ์ „ ๊ธˆ์ง€**: `turn_flag`๋กœ ์ œ์–ด. ํšŒ์ „ํ•˜๋ฉด `False`(๋‹ค์Œ์—” ํšŒ์ „ ๋ถˆ๊ฐ€), ์ „์ง„ํ•˜๋ฉด `True`(ํšŒ์ „ ๊ฐ€๋Šฅ) โ†’ ์ œ์ž๋ฆฌ 180ยฐ ๋ฐฉ์ง€, ํšŒ์ „ ์‚ฌ์ด ์ตœ์†Œ 1์นธ ์ „์ง„ ๊ฐ•์ œ.
- **์‹œ์ž‘ ์ œ์•ฝ**: ๋งจ ์ฒ˜์Œ ์ถœ๋ฐœ์ ์—์„œ๋Š” ํšŒ์ „ ๋ถˆ๊ฐ€(๋ฌด์กฐ๊ฑด ์ „์ง„), ์ดํ›„ ๋ณด์„ ์ง€์ ์—์„œ๋Š” ํšŒ์ „ 1ํšŒ ๊ฐ€๋Šฅ.
- ๋ชฉํ‘œ ๋ณด์„์„ **ํž™์—์„œ ์ฒ˜์Œ ๊บผ๋‚ด๋Š” ์ˆœ๊ฐ„**์ด ์ตœ์†Œ ๋น„์šฉ(๋‹ค์ต์ŠคํŠธ๋ผ ์„ฑ์งˆ) โ†’ ๊ทธ๋•Œ ์œ„์น˜ยท๋ฐฉํ–ฅ ๊ฐฑ์‹  ํ›„ ๋‹ค์Œ ๋ณด์„์œผ๋กœ.

## 5. ์‹ค์ œ ์ฝ”๋“œ
```python
from collections import deque
import heapq

T = int(input())
for tc in range(1, T + 1):
n = int(input())
grid = [list(map(int, input().split())) for _ in range(n)]

d = [(-1, 0), (0, 1), (1, 0), (0, -1)] # ์ƒ ์šฐ ํ•˜ ์ขŒ
num_of_turn = 0

# ๋‚ด๋ถ€ ๊ฒฉ์ž์—์„œ ๋ณด์„ ์ˆ˜์ง‘ ํ›„ ๋ฒˆํ˜ธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
jewels = [(y, x) for y in range(1, n-1) for x in range(1, n-1) if grid[y][x]]
jewels.sort(key=lambda cor: grid[cor[0]][cor[1]])
jewels = deque(jewels)

sy, sx = 0, 0 # ์‹œ์ž‘ ์ขŒํ‘œ
cur_d = 1 # ์‹œ์ž‘ ๋ฐฉํ–ฅ: ์˜ค๋ฅธ์ชฝ
first_flag = True

while jewels:
ey, ex = jewels.popleft()
q = []
# ์ตœ์ดˆ ์ถœ๋ฐœ์€ ํšŒ์ „ ๋ถˆ๊ฐ€(False), ์ดํ›„ ๋ณด์„ ์ถœ๋ฐœ์€ ํšŒ์ „ 1ํšŒ ๊ฐ€๋Šฅ(True)
heapq.heappush(q, (0, sy, sx, cur_d, not first_flag))
first_flag = False

while q:
cost, y, x, direct, turn_flag = heapq.heappop(q)

if y == ey and x == ex: # ๋ชฉํ‘œ ๋ณด์„ ๋„์ฐฉ
sy, sx = y, x
num_of_turn += cost # ํšŒ์ „ ์ˆ˜ ๋ˆ„์ 
cur_d = direct
break

if turn_flag: # ํšŒ์ „ (๋‹ค์Œ์—” ํšŒ์ „ ๋ถˆ๊ฐ€)
heapq.heappush(q, (cost+1, y, x, (direct+1) % 4, False))

ny, nx = y + d[direct][0], x + d[direct][1] # ์ „์ง„ (๋‹ค์Œ์—” ํšŒ์ „ ๊ฐ€๋Šฅ)
if 0 <= ny < n and 0 <= nx < n:
heapq.heappush(q, (cost, ny, nx, direct, True))

print(f'#{tc} {num_of_turn}')
```

---

### ๐Ÿง  ํšŒ๊ณ 
- cost ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ **ํšŒ์ „ ํšŸ์ˆ˜** ์ธ ๊ฒƒ๋งŒ ์ฃผ์˜ํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๋‹ค.
- ๊ฐœ์„  ์—ฌ์ง€: `visited` ์„ ํ™œ์šฉํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์ด๋กœ ์ธํ•ด ์ค‘๋ณต์ด ์ข€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐœ์„ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
# [SWEA 26071] ๋ธ”๋ก ์ œ๊ฑฐ ๊ฒŒ์ž„

| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|:---|:---|
| ๐Ÿ”— ๋ฌธ์ œ | https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AZwmCVWq3uLHBIT3& |
| ๐Ÿ“š ์ฃผ์ œ | ๊ตฌ๊ฐ„ DP (Interval DP ยท Burst Balloons ๊ณ„์—ด) |
| ๐ŸŽš๏ธ ๋‚œ์ด๋„ | D4 |
| โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„ | 3h + |
| ๐Ÿ” ๋‹ค์‹œ ํ’€๊ธฐ | ์˜ˆ |

---

## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ•
"์–ด๋–ค ์ˆœ์„œ๋กœ ๊นฐ๊นŒ"๋ฅผ ์ •๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด ์ˆœ์—ด `O(N!)`์ด๋ผ TLE.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿš€ Performance & Scalability | ๐ŸŸก Minor | โšก Quick win

๋ฐฑํŠธ๋ž˜ํ‚น ๋ณต์žก๋„๋ฅผ O(N!)๋ณด๋‹ค ์ •ํ™•ํžˆ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

์ด ๊ตฌํ˜„์€ ๊ฐ ์œ ํšจ ์ƒํƒœ๋งˆ๋‹ค ์ขŒยท์šฐ ์ด์›ƒ์„ ์ฐพ๋Š” ๋ฐ ์ตœ๋Œ€ O(N)์ด ๊ฑธ๋ฆฌ๊ณ , N๊ฐœ ํ›„๋ณด๋ฅผ ๋ชจ๋‘ ์žฌ๊ท€ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋„ ์—†์œผ๋ฏ€๋กœ ์ „์ฒด ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N ยท N!)์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ๋ฐฑํŠธ๋ž˜ํ‚น ์„ค๋ช…์„ ์‹ค์ œ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

As per path instructions, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์‹ค์ œ ์ฝ”๋“œ์˜ ๋ฐ˜๋ณตยทํƒ์ƒ‰ ๋น„์šฉ๊นŒ์ง€ ์ง์ ‘ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 102-112, 127-130, 147-148

๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@studies/week-02/Suyoung-Min/26071_๋ธ”๋ก์ œ๊ฑฐ๊ฒŒ์ž„.md` at line 14, ๋ฐฑํŠธ๋ž˜ํ‚น ์‹œ๊ฐ„ ๋ณต์žก๋„ ์„ค๋ช…์„
O(N!)์—์„œ O(N ยท N!)์œผ๋กœ ์ˆ˜์ •ํ•˜์„ธ์š”. ๊ฐ ์žฌ๊ท€ ์ƒํƒœ์—์„œ ์ขŒยท์šฐ ์ด์›ƒ์„ ์ตœ๋Œ€ O(N)์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์—†์ด N๊ฐœ ํ›„๋ณด๋ฅผ ์žฌ๊ท€
ํ˜ธ์ถœํ•˜๋Š” ์‹ค์ œ ๊ตฌํ˜„์„ ๋ฐ˜์˜ํ•ด ๊ด€๋ จ ์„ค๋ช…๊ณผ ์ ์šฉ ๊ตฌ๊ฐ„์˜ ๋ณต์žก๋„ ํ‘œ๊ธฐ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๊ฐฑ์‹ ํ•˜์„ธ์š”.

Source: Path instructions

๋ฐœ์ƒ์„ ๋’ค์ง‘์–ด "์ด ๊ตฌ๊ฐ„์—์„œ *๋งˆ์ง€๋ง‰*์— ๊นจ์ง€๋Š” ๋ธ”๋ก์ด ๋ˆ„๊ตฌ์ธ๊ฐ€"๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค.
๋งˆ์ง€๋ง‰์— ๊นจ์ง€๋Š” ๋ธ”๋ก `k`๋Š” ๊ทธ ์ˆœ๊ฐ„ ์ด์›ƒ์ด ๊ตฌ๊ฐ„ ์–‘ ๋๋ฟ์ด๋ผ ์ ์ˆ˜๊ฐ€ ํ™•์ •๋˜๊ณ ,
`k`๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒยท์šฐ ๊ตฌ๊ฐ„์ด **์™„์ „ํžˆ ๋…๋ฆฝ**์œผ๋กœ ๊ฐˆ๋ผ์ง„๋‹ค โ†’ ๊ตฌ๊ฐ„ DP๋กœ ์ ‘ํžŒ๋‹ค.

## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„
**O(Nยณ)** โ€” ๊ตฌ๊ฐ„ ํญ ร— ์™ผ์ชฝ ๊ฒฝ๊ณ„ ร— ๋ถ„ํ• ์  `k`. ์ˆœ์—ด `O(N!)`์—์„œ ํฌ๊ฒŒ ๊ฐœ์„ .

## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„
**O(Nยฒ)** โ€” `dp[l][r]` 2์ฐจ์› ํ…Œ์ด๋ธ”.

## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ
- ์–‘ ๋์— ๊ฐ’ `1` **์„ผํ‹ฐ๋„ฌ**์„ ๋ถ™์ธ๋‹ค โ†’ "์ด์›ƒ ํ•œ์ชฝ๋งŒ ์žˆ์„ ๋•Œ ๊ทธ ๊ฐ’๋งŒํผ"์ด `1ร—์ด์›ƒ๊ฐ’`์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌ.
- `dp[l][r]` = ๊ฒฝ๊ณ„ `l`, `r`๋Š” **๋ฒฝ์œผ๋กœ ๋‚จ๊ธด ์ฑ„** ๊ทธ *์‚ฌ์ด* ๋ธ”๋ก์„ ์ „๋ถ€ ๊นฐ ๋•Œ์˜ ์ตœ๋Œ€ ์ ์ˆ˜.
- `dp[l][r] = b[l] * b[r] + max( dp[l][k] + dp[k][r] )` (`l < k < r`)
- `k`๋ฅผ ๋งˆ์ง€๋ง‰์— ๊นจ๋Š” ์ˆœ๊ฐ„์˜ ์ ์ˆ˜๊ฐ€ `b[l] * b[r]` (์ž๊ธฐ ๊ฐ’์€ ์•ˆ ๋“ค์–ด๊ฐ).
- **๋งˆ์ง€๋ง‰ ํ•œ ๋ธ”๋ก**์€ ์ด์›ƒ์ด ์—†์–ด ์ž๊ธฐ ๊ฐ’์„ ์–ป์Œ โ†’ DP๋กœ ๋ชป ์ ‘ํžˆ๋Š” ์˜ˆ์™ธ๋ผ ๋ฐ–์—์„œ ์ฒ˜๋ฆฌ:
- ๋งˆ์ง€๋ง‰ ๋ธ”๋ก `p`๋ฅผ ๊ณ ์ •ํ•ด `dp[0][p] + dp[p][n+1] + b[p]`์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •๋‹ต.

## 5. ์‹ค์ œ ์ฝ”๋“œ
```python
T = int(input())
for tc in range(1, T+1):

N = int(input())
arr = list(map(int ,input().split())) # N

b = [1] + arr + [1] # 0 ~ n+1 # 1 + 0 ~ n-1 + 1

M = N + 2

dp = [[0]*(M) for _ in range(M)]

for length in range(2, M):

for l in range(M - length):
r = l + length

best = dp[l][l+1] + dp[l+1][r]

for k in range(l+1, r):
best = max(dp[l][k] + dp[k][r], best)

dp[l][r] = b[l] * b[r] + best

ans = max(dp[0][p] + dp[p][N+1] + b[p] for p in range(1, N+1))

print(f'#{tc} {ans}')

## ๋ฐฑํŠธ๋ž˜ํ‚น - ์‹œ๊ฐ„์ดˆ๊ณผ

# T = int(input())
# # ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ฃผ์–ด์ง€๋ฏ€๋กœ, ๊ฐ๊ฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
# for test_case in range(1, T + 1):
# # ///////////////////////////////////////////////////////////////////////////////////

# n = int(input())

# arr = list(map(int, input().split()))

# ans_score = 0

# # ์‚ญ์ œ๋œ ๊ฑฐ -> 0
# # ์ˆœ์„œ ์žˆ๋Š” ์ˆœ์—ด
# # arr[i] = 0 ์œผ๋กœ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

# def backtrack(cidx, score, remain_block):
# global ans_score

# #print(f'cidx: {cidx}, score: {score}, remain_block: {remain_block}')

# # ์ข…๋ฃŒ ์กฐ๊ฑด
# if remain_block == 0: # ๋ธ”๋ก ํƒ์ƒ‰ ์™„๋ฃŒ
# ans_score = max(ans_score, score)
# return

# if arr[cidx] == 0: # ๋ถ€์ˆด์ง„ ๋ธ”๋ก์ด๋ฉด
# return

# # ํ˜„์žฌ ์œ„์น˜๋Š” ํ•ญ์ƒ ์˜จ์ „ํ•œ ๋ธ”๋ก
# # ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ์™ผ์ชฝ ์ด์›ƒ ์žˆ๋Š”์ง€

# left_idx = -1
# right_idx = -1

# left_neighbor = False
# right_neighbor = False

# for lidx in range(cidx-1, -1, -1):
# if arr[lidx]: # ์•ˆ๋ถ€์ˆด์ง„ ๋ธ”๋ก์ด๋ฉด
# left_idx = lidx
# left_neighbor = True
# break

# for ridx in range(cidx+1, n):
# if arr[ridx]: # ์•ˆ๋ถ€์ˆด์ง„ ๋ธ”๋ก์ด๋ฉด
# right_idx = ridx
# right_neighbor = True
# break

# if left_neighbor and right_neighbor:
# score += arr[left_idx] * arr[right_idx]

# elif left_neighbor:
# score += arr[left_idx]

# elif right_neighbor:
# score += arr[right_idx]

# else: # ์ด์›ƒ์—†์„ ๋•Œ
# score += arr[cidx]

# save_block = arr[cidx]
# for i in range(n):
# arr[cidx] = 0

# backtrack(i, score, remain_block - 1)

# arr[cidx] = save_block

# for s in range(n):
# backtrack(s, 0, n)

# print('#'+str(test_case), ans_score)

# # ///////////////////////////////////////////////////////////////////////////////////
```

---

### ๐Ÿง  ํšŒ๊ณ 
- "์ •๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ ์ชผ๊ฐœ์ง€๋ฉด **๋งˆ์ง€๋ง‰(๋˜๋Š” ์ฒ˜์Œ) ํ•˜๋‚˜๋ฅผ ๊ณ ์ •**ํ•ด ์–‘์ชฝ์„ ๋…๋ฆฝ์‹œํ‚จ๋‹ค"๊ฐ€ ๊ตฌ๊ฐ„ DP์˜ ํ•ต์‹ฌ ๋ฐœ์ƒ.
- ์„ผํ‹ฐ๋„ฌ `1`๋กœ ๊ฒฝ๊ณ„ ์˜ˆ์™ธ๋ฅผ, `+ b[p]`๋กœ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ โ€” **DP๋กœ ๋ชป ์ ‘๋Š” ์˜ˆ์™ธ๋Š” ๋ฐ–์—์„œ ์ฑ™๊ธด๋‹ค.**
- ์ˆœ์—ด ํ’€์ด๋Š” N์ด ์ž‘์„ ๋•Œ๋งŒ ํ†ต๊ณผ. ๊ทผ๋ณธ ํ•ด๊ฒฐ์€ ๊ตฌ๊ฐ„ DP `O(Nยณ)`.
- ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ๋Š” ์‹œ๊ฐ„ ์ œํ•œ์ด ๊ฑธ๋ฆด ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋‹น์—ฐํžˆ ํ„ฐ์กŒ๋‹ค.
- DP ๋Š” ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๋„ˆ๋ฌด ํ’€๊ธฐ ์–ด๋ ค์›Œ์„œ ํ‰์†Œ์— DP ์—ฐ์Šต์„ ์ข€ ์ง„ํ–‰ํ•ด์•ผ ํ•  ๋“ฏ ํ•˜๋‹ค.
- ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ํ’€๊ธฐ ๋ชปํ•ด์„œ CLAUDE ์—๊ฒŒ ์‹œ์ผฐ๋‹ค...
- ๊ฐ™์€ ๊ตฌ๊ฐ„ DP ๋ฌธ์ œ์ธ BURST BALLOONS ๋ฌธ์ œ๋„ ๊ฐ™์ด ์—ฐ์Šตํ• ๋งŒํ•˜๋‹ค.
130 changes: 130 additions & 0 deletions studies/week-02/Suyoung-Min/5656_๋ฒฝ๋Œ๊นจ๊ธฐ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# [SWEA] ๋ฒฝ๋Œ ๊นจ๊ธฐ

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

---

## 1. ์ ‘๊ทผ ๋ฐฉ๋ฒ•
๊ตฌ์Šฌ ํ•˜๋‚˜๋ฅผ ๋–จ์–ด๋œจ๋ฆด ๋•Œ **์–ด๋А ์—ด์— ๋–จ์–ด๋œจ๋ฆด์ง€** ๋งค๋ฒˆ W๊ฐ€์ง€ ์„ ํƒ โ†’ ์ด N๋ฒˆ โ†’ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ **DFS ์™„์ „ํƒ์ƒ‰**.
๊ฐ ์„ ํƒ๋งˆ๋‹ค (1) ๊ทธ ์—ด ๋งจ ์œ„ ๋ฒฝ๋Œ์„ ํ„ฐ๋œจ๋ฆฌ๊ณ  โ†’ (2) ์ˆซ์ž๋งŒํผ ์ƒํ•˜์ขŒ์šฐ๋กœ **์—ฐ์‡„ ํญ๋ฐœ** โ†’ (3) **์ค‘๋ ฅ**์œผ๋กœ ๋ฒฝ๋Œ ๋‚™ํ•˜ โ†’ (4) ๋‹ค์Œ ๊ตฌ์Šฌ๋กœ ์žฌ๊ท€.
๊ตฌ์Šฌ์„ ๋‹ค ์“ฐ๊ฑฐ๋‚˜ ๋ฒฝ๋Œ์ด 0์ด ๋˜๋ฉด ๋‚จ์€ ๋ฒฝ๋Œ ์ˆ˜๋ฅผ **์ตœ์†Ÿ๊ฐ’์— ๊ฐฑ์‹ **.

## 2. ์‹œ๊ฐ„ ๋ณต์žก๋„
**O(Wแดบ ยท WยทH)** โ€” ๋งค ๋‹จ๊ณ„ W๊ฐœ ์—ด ๋ถ„๊ธฐ ร— ๊นŠ์ด N, ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๊ทธ๋ฆฌ๋“œ ๋ณต์‚ฌยทํญ๋ฐœยท์ค‘๋ ฅ์ด O(WยทH).
NยทW๊ฐ€ ์ž‘์•„ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ†ต๊ณผ (๋ชจ์˜ ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ ์ œ์•ฝ ๊ธฐ์ค€).

## 3. ๊ณต๊ฐ„ ๋ณต์žก๋„
**O(N ยท WยทH)** โ€” ์žฌ๊ท€ ๊นŠ์ด N๋งŒํผ ๊ทธ๋ฆฌ๋“œ ๋ณต์‚ฌ๋ณธ์„ ์Šคํƒ์— ์œ ์ง€.

## 4. ํ•ต์‹ฌ ํ’€์ด ๋ฐฉ๋ฒ• โญ
- **๋ถ„๊ธฐ**: ๊ฐ ์—ด์—์„œ ๋งจ ์œ„ ๋ฒฝ๋Œ ํ•˜๋‚˜๋ฅผ ์ฐพ์•„(์—†์œผ๋ฉด skip) ๊ทธ ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•ด ํญ๋ฐœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜.
- **์—ฐ์‡„ ํญ๋ฐœ(BFS)**: ํ์— ํ„ฐ์งˆ ๋ฒฝ๋Œ์„ ๋„ฃ๊ณ , ๋ฒฝ๋Œ ๊ฐ’ `block_size`๋งŒํผ 4๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ `1..block_size-1`์„ ํ›‘์–ด ๋ฒฝ๋Œ์ด๋ฉด ํ์— ์ถ”๊ฐ€ โ†’ ์—ฐ์‡„ ์ฒ˜๋ฆฌ.
- **์ค‘๋ ฅ**: ๊ฐ ์—ด์„ ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ ๋นˆ์นธ ์—†์ด ์ •๋ ฌ(`gravity_fall`).
- **์ข…๋ฃŒยท๊ฐฑ์‹ **: ๋ฒฝ๋Œ ํ•ฉ์ด 0์ด๋ฉด 0์œผ๋กœ ํ™•์ •, ๊ตฌ์Šฌ ์†Œ์ง„ ์‹œ ๋‚จ์€ ๋ฒฝ๋Œ ์ˆ˜๋ฅผ `min`์œผ๋กœ ๊ฐฑ์‹ .

## 5. ์‹ค์ œ ์ฝ”๋“œ
```python
import copy
from collections import deque
Comment on lines +33 to +34

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿš€ Performance & Scalability | ๐Ÿ”ต Trivial | โšก Quick win

copy.deepcopy ๋Œ€์‹  ํ–‰ ๋‹จ์œ„ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

grid๋Š” list[list[int]]์ด๋ฉฐ ์›์†Œ๊ฐ€ ์ •์ˆ˜์ด๋ฏ€๋กœ copy.deepcopy๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  DFS ๋ถ„๊ธฐ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊นŠ์€ ๋ณต์‚ฌ ๋น„์šฉ์ด ์ตœ์•… ์ž…๋ ฅ์—์„œ TLE ์—ฌ์œ ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณต์‚ฌํ•˜๋ฉด ๋™์ผํ•œ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ • ์˜ˆ์‹œ
-import copy
 from collections import deque

...

-            ngrid = copy.deepcopy(grid)
+            ngrid = [row[:] for row in grid]

๋ฌธ์„œ์˜ ์ „์ฒด ๋ณต์žก๋„ ํ‘œ๊ธฐ O(W^N ยท WยทH)๋Š” ์œ ์ง€๋˜์ง€๋งŒ, ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ƒ์ˆ˜ ๋น„์šฉ์„ ์ค„์ด๋Š” ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ž…๋ ฅ์œผ๋กœ ๋‘ ๋ฐฉ์‹์„ ๊ฐ„๋‹จํžˆ ๋ฒค์น˜๋งˆํฌํ•ด ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

As per path instructions, SWEA ํ’€์ด์—์„œ๋Š” ์ตœ๋Œ€ ์ž…๋ ฅ ๊ธฐ์ค€ TLE ์œ„ํ—˜์„ ๋ฐ˜๋“œ์‹œ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 96-97

๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@studies/week-02/Suyoung-Min/5656_๋ฒฝ๋Œ๊นจ๊ธฐ.md` around lines 33 - 34,
copy.deepcopy๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , DFS ๋ถ„๊ธฐ์—์„œ grid๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ฐ ํ–‰์˜ ์–•์€ ๋ณต์‚ฌ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”. ์ •์ˆ˜ ์›์†Œ๋งŒ ํฌํ•จ๋œ
list[list[int]] ๊ตฌ์กฐ์˜ ๋™์ž‘์€ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ชจ๋“  ๋ถ„๊ธฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊นŠ์€ ๋ณต์‚ฌ ๋น„์šฉ์„ ์ค„์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ด€๋ จ ๋ณต์‚ฌ ๋กœ์ง๊ณผ import
copy๋ฅผ ํ•จ๊ป˜ ์ •๋ฆฌํ•˜์„ธ์š”.

Source: Path instructions


T = int(input())
for tc in range(1, T + 1):
N, W, H = map(int, input().split())

arr = [list(map(int, input().split())) for _ in range(H)]

d = [(-1, 0), (0, 1), (1, 0), (0, -1)]

remain_blocks = int(1e10)
def gravity_fall(grid):
for x in range(W):
col = [grid[y][x] for y in range(H) if grid[y][x]]
col = [0] * (H - len(col)) + col
for y in range(H):
grid[y][x] = col[y]
return grid

# def gravity_fall(grid):

# h = len(grid)
# w = len(grid[0])

# for x in range(w):
# tarr = [0]*h
# tidx = h-1

# for y in range(h-1, -1, -1):
# if grid[y][x]: # ์žˆ์œผ๋ฉด
# tarr[tidx] = grid[y][x]
# tidx -= 1

# for y in range(h):
# grid[y][x] = tarr[y]

# return grid

def dfs(remain_balls, grid):
global remain_blocks

if sum(sum(row) for row in grid) == 0:
remain_blocks = 0
return

if remain_balls == 0:
remain_blocks = min(sum([grid[y][x] != 0 for y in range(H) for x in range(W)]), remain_blocks)
return
for fall_x in range(W):

find_block = False

bq = deque([])

for y in range(H):
if grid[y][fall_x]: # ๋ธ”๋ก์ด ์žˆ๋‹ค๋ฉด
find_block = True
bq.append((y, fall_x))
break

if not find_block: continue

# ngrid = [row[:] for row in grid] # ๊นŠ์€ ๋ณต์‚ฌ
ngrid = copy.deepcopy(grid)

# 2. ๋ธ”๋ก ๋ถ€์ˆ˜๊ธฐ

while bq:
by, bx = bq.popleft()

block_size = ngrid[by][bx]
ngrid[by][bx] = 0

for size in range(1, block_size):
for dy, dx in d:
ny = by + dy * size
nx = bx + dx * size

# ๊ทธ๋ฆฌ๋“œ ์•ˆ์ด๊ณ , ๋ธ”๋ก์ด๋ฉด
if (0 <= ny < H and 0 <= nx < W) and ngrid[ny][nx]:
bq.append((ny, nx))

# ๋ธ”๋ก ๋ถ€์‰ˆ์œผ๋‹ˆ gravity
ngrid = gravity_fall(ngrid)

dfs(remain_balls-1, ngrid)

dfs(N, arr)
print(f'#{tc} {remain_blocks}')
```

---

### ๐Ÿง  ํšŒ๊ณ 
- "์„ ํƒ ๋ถ„๊ธฐ(DFS) + ์ƒํƒœ ๋ณต์‚ฌ + ์‹œ๋ฎฌ๋ ˆ์ด์…˜(ํญ๋ฐœยท์ค‘๋ ฅ)" ์˜ ๊ฒฐํ•ฉ.
- ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•ด ๋ถ„๊ธฐํ•˜๋ฏ€๋กœ ๊ฐ ์žฌ๊ท€๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ณต์‚ฌ ๋ฐฉ์‹(`copy.deepcopy` vs ํ–‰ ๋ณต์‚ฌ)์„ ์•Œ์•„๋‘์ž.
- ์ค‘๋ ฅ ์ฒ˜๋ฆฌ ๋ถ€๋ถ„ `gravity_fall` ํ•จ์ˆ˜๋Š” CLAUDE ๊ฐ€ ์ถ”์ฒœํ•œ ์ฝ”๋“œ๋‹ค. ์ฃผ์„์ฒ˜๋ฆฌํ•œ ๊ฑด ๋ณธ์ธ ์ฝ”๋“œ์ธ๋ฐ, CLAUDE์˜ ์ค‘๋ ฅ ํ•จ์ˆ˜๊ฐ€ ์ข€ ๋” ์‹ค์ˆ˜๊ฐ€ ์ ์„ ๊ฒƒ ๊ฐ™๋‹ค. 3์ฐจ์›์—์„œ์˜ ์ค‘๋ ฅ ์ ์šฉ๋„ ์ƒ๊ฐํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.
Loading