Skip to content

Commit 95557bc

Browse files
Merge pull request #1846 from CodingTestStudy2/남효정
[남효정] Day18
2 parents 1167ee6 + 4c38a3a commit 95557bc

1 file changed

Lines changed: 18 additions & 26 deletions

File tree

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,24 @@
1-
# 풀이 실패
21
class Solution:
3-
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:
4-
memo = {}
5-
MOD = 10**9 + 7
62

7-
def dp(r, c, moves):
8-
# 밖으로 탈출한 경우
9-
if r < 0 or r >= m or c < 0 or c >= n:
10-
return 1
3+
# 풍선 k가 가장 마지막으로 터진다면 양 옆의 풍선은 무조건 l, r임
4+
# 그러므로 k 기준으로 좌측(left, k), 우측(k, right)로 나눠서 배열 작성함
115

12-
# 이동 횟수 전부 사용한 경우
13-
if moves == 0:
14-
return 0
6+
def maxCoins(self, nums: List[int]) -> int:
7+
# 양 끝 경계에 1을 추가한다
8+
A = [1] + nums + [1]
9+
n = len(A)
10+
dp = [[0] * n for _ in range(n)]
1511

16-
# 이미 계산된 위치거나 남은 이동 횟수라면 저장된 값으로 사용
17-
if (r, c, moves) in memo:
18-
return memo[(r, c, moves)]
12+
# l과 r 사이의 거리 구하기 (2부터 n-1까지)
13+
for length in range(2, n):
14+
for l in range(n - length):
15+
r = l + length
1916

20-
# 상, 하, 좌, 우 이동 경로 합산
21-
res = (
22-
dp(r + 1, c, moves - 1)
23-
+ dp(r - 1, c, moves - 1)
24-
+ dp(r, c + 1, moves - 1)
25-
+ dp(r, c - 1, moves - 1)
26-
) % MOD
17+
# l과 r 사이의 k 중 최댓값 찾아서 갱신함
18+
# k 마지막에 터뜨릴 때 얻는 코인 + 좌측 코인 + 우측 코인
19+
dp[l][r] = max(
20+
A[l] * A[k] * A[r] + dp[l][k] + dp[k][r]
21+
for k in range(l + 1, r)
22+
)
2723

28-
# 결과 기록 후 반환
29-
memo[(r, c, moves)] = res
30-
return res
31-
32-
return dp(startRow, startColumn, maxMove)
24+
return dp[0][n - 1]

0 commit comments

Comments
 (0)