3191. Minimum Operations to Make Binary Array Elements Equal to One I

Jeong-yun Lee·2025년 3월 19일

LeetCode

목록 보기
11/16

0. 문제:

이진 배열 nums가 주어집니다. (배열의 요소가 0 혹은 1로만 구성)

배열에서 다음 작업을 여러 번(최소 0회) 수행할 수 있습니다:

  • 배열에서 연속된 세 개의 요소를 선택하고 모두 뒤집습니다.
    요소를 뒤집는다는 것은 그 값을 0에서 1로, 그리고 1에서 0으로 바꾸는 것을 의미합니다.

nums의 모든 요소를 1로 만드는 데 필요한 최소 연산 수를 반환합니다. 불가능한 경우 -1을 반환합니다.

예제 1:

  • 입력: nums = [0,1,1,1,0,0]
  • 출력: 3
  • 설명:
    다음 작업을 수행할 수 있습니다:

    인덱스 0, 1, 2의 요소를 선택합니다. 결과 배열은 숫자 = [1, 0, 0, 1, 0, 0]입니다.
    인덱스 1, 2, 3의 요소를 선택합니다. 결과 배열은 숫자 = [1, 1, 1, 0, 0, 0]입니다.
    인덱스 3, 4, 5의 요소를 선택합니다. 결과 배열은 숫자 = [1, 1, 1, 1, 1, 1]입니다.

예제 2:

  • 입력: nums = [0,1,1,1]
  • 출력: -1
  • 설명:
    모든 요소를 1로 만드는 것은 불가능합니다.

제약 조건:

3 <= nums.length <= 105
0 <= nums[i] <= 1

1. 풀이

  • 거창한 논리 없이, 배열을 1회 순회하면서 가능한 모든 비트를 뒤집었을 때, 배열의 모든 요소가 1이 된다면 그게 최소 연산 횟수이다.
  • 값이 0인 i번째 요소를 찾으면 i + 2번째 요소가 존재하는지 확인한 후 연속된 3개의 비트를 뒤집는다.
  • XOR(^) 연산을 통해 비트 뒤집기를 구현.
  • 모든 비트가 1이라는 것은 각 요소의 총합이 배열의 길이와 같다는 의미이다.
class Solution {
  public int minOperations(int[] nums) {
    int flip = 0;
    int numsCheck = 0;

    for (int i = 0; i < nums.length; i++) {
      if (nums[i] == 0 && i + 2 <= nums.length - 1) {
        nums[i] = nums[i] ^ 1;
        nums[i + 1] = nums[i + 1] ^ 1;
        nums[i + 2] = nums[i + 2] ^ 1;
        flip++;
      }
      if (nums[i] == 1)
        numsCheck++;
    }
    if (numsCheck == nums.length)
      return flip;
    return -1;
  }
}
profile
push hard 🥕

0개의 댓글