You are given a binary array nums and an integer k.
A k-bit flip is choosing a subarray of length k from nums
and simultaneously changing every 0 in the subarray to 1, and every 1 in the subarray to 0.
Return the minimum number of k-bit flips required so that
there is no 0 in the array. If it is not possible, return -1.
A subarray is a contiguous part of an array.
이진 배열 nums와 정수 k가 주어진다.
사용자는 이진 배열에서 k 길이 만큼의 부분 배열 부분을 비트플립 할수 있다.
이 연산을 n번 했을때 모든 배열의 값을 1로 변경할수 있다면 최소한으로 드는 연산의 횟수를 구하시오.
class Solution:
def minKBitFlips(self, nums: List[int], k: int) -> int:
q = collections.deque()
ans = 0
N = len(nums)
for right in range(N):
# 더이상 자신의 index에 영향을 미치지 않는 flip은 제거한다.
while q and q[0] <= right - k:
q.popleft()
# 더이상 flip을 진행할수 없는 길이인데 0이 나오면 완성될수 없다.
if N - k < right and (nums[right] + len(q)) % 2 == 0:
return -1
# flip을 진행하고 시작 index를 queue 에 기록한다.
if (nums[right] + len(q)) % 2 == 0:
ans += 1
q.append(right)
return ans
import pygame
import sys
# Initialize Pygame
pygame.init()
# Constants
WIDTH, HEIGHT = 800, 600
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
FONT_SIZE = 40
# Screen setup
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("K-bit Flip Game")
font = pygame.font.Font(None, FONT_SIZE)
# Game variables
k = 3
nums = [0,0,0,1,0,1,1,0]
cell_size = WIDTH // len(nums)
flips = 0
def draw_array():
for i, num in enumerate(nums):
color = GREEN if num == 1 else RED
pygame.draw.rect(screen, color, pygame.Rect(i * cell_size, HEIGHT // 2 - cell_size // 2, cell_size, cell_size))
text = font.render(str(num), True, WHITE)
screen.blit(text, (i * cell_size + cell_size // 2 - FONT_SIZE // 4, HEIGHT // 2 - FONT_SIZE // 2))
def flip_subarray(start):
global flips
if start + k > len(nums):
return
for i in range(start, start + k):
nums[i] = 1 - nums[i]
flips += 1
def check_win():
return all(num == 1 for num in nums)
# Game loop
running = True
while running:
screen.fill(BLACK)
draw_array()
win = check_win()
if win:
win_text = font.render("You Win!", True, WHITE)
screen.blit(win_text, (WIDTH // 2 - FONT_SIZE, HEIGHT // 4))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and not win:
x, y = event.pos
if HEIGHT // 2 - cell_size // 2 <= y <= HEIGHT // 2 + cell_size // 2:
index = x // cell_size
flip_subarray(index)
pygame.display.flip()
pygame.quit()
sys.exit()