defsolution(arr,s): for i inrange(len(arr)): sum = s for j inrange(i,len(arr)): sum -= arr[j] if (sum == 0): return [i+1,j+1]
2-1. O(n) 시간복잡도로 풀기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
defsolution(arr,s): sum = s index = 0 position = 0 whilesum != 0: if position == len(arr) - 1: return [-1] sum -= arr[position] ifsum < 0: index += 1 position = index sum = s continue position += 1 return [index+1,position]
sum에 s를 할당하여 position 위치의 요소를 하나씩 빼면서 sum 값이 0 보다 작은지 체크
0 보다 작다면 연속되는 부분합이 아니므로 리셋시켜주고 시작 index도 우측으로 이동시킨다.
만약 시작 index가 배열의 끝까지 도달했는데도 sum이 0이 되지 않으면 연속되는 부분합을 만들 수 없다.
2-2. O(n) 시간복잡도로 풀기
1 2 3 4 5 6 7 8 9 10
defsolution(arr,s): left,sum = 0,0 for right inrange(len(arr)): sum += arr[right] while (left < right andsum > s): sum -= arr[left] left += 1 ifsum == s: return [left+1,right+1] return [-1]
배열의 첫번째 요소부터 하나씩 sum에 더해준다.
sum이 s보다 작거나 같으면 계속 배열의 요소를 더해준다.
sum > s를 만족하면, sum에 left 위치의 요소를 빼주면서 sum이 s보다 작거나 같으면 중단
이 때, sum == s를 만족하면 [left+1, right+1]을 반환한다.
left == right 일 때, sum == s를 만족하지 않으면 연속되는 부분합이 없다.
defget_increased_arr(arr): left = 0 right = len(arr) - 1
while left < right: while arr[left] == 0: left += 1 while arr[right] == 1and right >= 0: right -= 1 if left < right: arr[left], arr[right] = 0, 1 left, right = left + 1, right + 1 return arr