반응형

 

1. 문제

 

 

2진 배열 nums가 주어지고, 배열 내에서 한 개의 요소를 지워야 한다.

 

1로만 이루어진 가장 긴 하위 배열의 길이를 리턴하면 된다. 하위 배열이 없다면 0을 리턴하면 된다.

 

 


 

2. 풀이 과정

 

가장 먼저, 모든 요소가 1이라면 반환되는 값은 배열 길이에서 1을 뺀 것과 같으니 예외처리를 해놓고 시작했다.

 

배열을 순회하며 1의 길이를 재다가 0을 만나면 두 가지 경우를 고려할 수 있다.

0의 앞뒤로 1이 존재하는가? 아닌가?

 

편의상 0의 앞뒤로 1이 존재한다면 그 0을 soloZero라고 칭한다.

 

soloZero를 제거해 앞 뒤 1의 길이들을 합칠 수 있으니 앞에서 쟀던 1의 길이와 현재 재고 있는 1의 길이를 동시에 갖고 있어야 하므로 현재 길이를 저장하는 변수와 이전에 측정했던 1의 길이를 저장하는 버퍼 변수를 선언했다.

 

배열을 순회하다가 0을 만났고, 그 0이 soloZero라면 현재 길이를 버퍼에 저장하고 현재 길이를 초기화해 준 뒤 다시 측정한다.

soloZero가 아니라면 버퍼와 현재 길이 둘 다 0으로 초기화하고 길이를 처음부터 다시 측정한다.

 

길이는 버퍼와 현재 길이의 합이다.

 

길이를 측정하며 result에 저장하고, 최댓값을 저장할 수 있도록 Math.Max()를 사용했다.

 

public class Solution {
    public int LongestSubarray(int[] nums) {
        if(nums.Sum() == nums.Length)
            return nums.Length - 1;
        
        int oneLength = 0;
        int oneLengthBuffer = 0;
        int result = 0;
        
        for(int i = 0, length = nums.Length; i < length; ++i)
        {
            if(nums[i] == 0)
            {
                if(i - 1 >= 0 && i + 1 < length && nums[i - 1] == 1 && nums[i + 1] == 1)
                {
                    oneLengthBuffer = oneLength;
                    oneLength = 0;
                }
                else
                {
                    oneLengthBuffer = oneLength = 0;
                }
            }
            else
            {
                oneLength++;
            }

            result = Math.Max(result, oneLength + oneLengthBuffer);
        }

        return result;
    }
}

 

 

 

반응형