힌트 참고했다. 0이 항상 한 개 껴있다고 생각하라고 한다.
그럼 아이디어가 잘 나왔다.
첫 번째 순회에서 0이 한 개 존재하는 동안 가장 긴 길이를 세팅한다.
두 번째 순회는 right를 증가하되 0의 갯수가 늘어나면 left를 ++시키면서 0이 한개 존재하는 상황을 유지하며 right - left + 1
최대 길이를 갱신한다.
마지막으로 length는 0 한개를 포함한 길이이기 때문에, 이것을 제거했다고 취급하면 -1해서 리턴해주면 된다.
class Solution {
public int longestSubarray(int[] nums) {
int left = 0;
int right = 0;
int zeros = 0;
int length = 0;
for (int i=0; i<nums.length; i++) {
if (nums[i] == 0) {
zeros++;
}
if (zeros >= 2) {
right = i;
zeros--;
break;
}
length++;
}
for (; right<nums.length; right++) {
if (nums[right] == 0) {
zeros++;
}
while (zeros >= 2) {
if (nums[left] == 0) {
zeros--;
}
left++;
}
length = Math.max(length, right - left + 1);
}
return length - 1; // 0이 빠져야 함
}
}