문제
간단한 DP 문제이다.
요약하면, 0
과 1
로 구성된 문자열에서 010
또는 101
경우의 수를 찾는 문제이다.
조건이 3 <= s.length <= 10^5
이므로 시간복잡도는 O(N)이 되도록 접근하였다.
풀이
처음에는 양 끝의 수가 같은 경우, 안의 숫자의 갯수를 구하려고 했으나,
가운데 수를 정하고 양 끝의 수의 갯수를 정하는 방법이 더욱 간단한 접근이었다.
Loop를 돌면서 가운데 수가 1
이면 양 옆의 0
의 갯수의 곱이 가운데 1
의 010
가짓수가 된다.
먼저, 미리 각 index 지점 까지의 0
과 1
의 갯수를 계산해 놓는다.
그리고 n
번 째가 0
이라 할 때, n-1
번 째 까지의 1
과 n+1
번 째 부터 끝까지의 1
의 갯수의 곱이
n
번 째의 010
가짓수가 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def numberOfWays(self, s: str) -> int:
result = 0
l = []
c0 = 0
c1 = 0
for c in s:
if c == '0':
c0 += 1
else:
c1 += 1
l.append((c0, c1))
t0 = c0
t1 = c1
for i in range(1, len(s)-1):
if s[i] == '0':
result += l[i-1][1] * (t1 - l[i][1])
else:
result += l[i-1][0] * (t0 - l[i][0])
return result
회고
- 알고리즘은 많이 풀어보면 감이 온다.
- 아이디어, 즉 접근법이 정말 중요하다.
- 은근 개발할 때 도움도 많이 되는듯.