Skip to content

Commit ac2c2d2

Browse files
Merge pull request #1708 from CodingTestStudy2/최원준
[최원준] Day27
2 parents c999e7e + 9089014 commit ac2c2d2

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#
2+
3+
'''
4+
1. 아이디어 :
5+
s[left:right+1] 구간을 출력하는 최소 횟수
6+
"aba"를 보면:
7+
dp[0][2] = 1 + dp[1][2] = 3
8+
9+
s[0] == s[2]이므로
10+
dp[0][2] = dp[1][1] + dp[2][2]
11+
= 1 + 1
12+
= 2
13+
14+
2. 시간복잡도 :
15+
O(n**2)
16+
17+
3. 자료구조/알고리즘 :
18+
dp
19+
20+
'''
21+
22+
class Solution:
23+
def strangePrinter(self, s: str) -> int:
24+
n = len(s)
25+
26+
# dp[left][right]:
27+
# s[left:right + 1]을 출력하는 최소 횟수
28+
dp = [[0] * n for _ in range(n)]
29+
30+
for i in range(n):
31+
dp[i][i] = 1
32+
33+
# 짧은 구간부터 계산
34+
for length in range(2, n + 1):
35+
for left in range(n - length + 1):
36+
right = left + length - 1
37+
38+
# s[left]를 별도로 한 번 출력
39+
dp[left][right] = 1 + dp[left + 1][right]
40+
41+
# s[left]와 같은 문자를 출력하는 턴에 같이 처리
42+
for k in range(left + 1, right + 1):
43+
if s[left] == s[k]:
44+
middle = dp[left + 1][k - 1] if left + 1 <= k - 1 else 0
45+
46+
dp[left][right] = min(
47+
dp[left][right],
48+
middle + dp[k][right]
49+
)
50+
51+
return dp[0][n - 1]

0 commit comments

Comments
 (0)