[LeetCode] 1004. Max Consecutive Ones III 해설 및 풀이 (Python)

2025. 4. 8. 21:30·Study/코딩 테스트
반응형

LeetCode 1004. Max Consecutive Ones III

https://leetcode.com/problems/max-consecutive-ones-iii/description/?envType=study-plan-v2&envId=leetcode-75

 


Given a binary array nums and an integer k, return the maximum number of consecutive 1's in the array if you can flip at most k 0's.

Example 1:

Input: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
Output: 6
Explanation: [1,1,1,0,0,1,1,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.

 

Example 2:

Input: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3
Output: 10
Explanation: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.
 

Constraints:

1 <= nums.length <= 105
nums[i] is either 0 or 1.
0 <= k <= nums.length

 

한글 해석

더보기

이진 배열 nums과 정수가 주어졌을 때 k, 최대 '의 개수를 뒤집을 수 있다면 배열에서 연속된 '의 최대 개수를 반환합니다. 1 k 0

예시 1:

입력: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
 출력: 6
 설명: [1,1,1,0,0, 1 ,1,1,1,1, 1 ]
굵은 글씨로 표시된 숫자는 0에서 1로 뒤집혔습니다. 가장 긴 부분 배열은 밑줄이 그어져 있습니다.

 

예시 2:

입력: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3
 출력: 10
 설명: [0,0, 1,1, 1 , 1 ,1,1,1, 1 ,1,1 ,0,0,0,1,1,1,1]
굵은 글씨로 표시된 숫자는 0에서 1로 뒤집혔습니다. 가장 긴 부분 배열은 밑줄이 그어져 있습니다.
 

제약사항:

1 <= nums.length <= 105
nums[i]0또는 둘 중 하나 입니다 1.
0 <= k <= nums.length


문제 유형

정렬

이진 탐색

슬라이딩 윈도우

누적 합

 

풀이 방법 도출

 

이 문제는 슬라이딩 윈도우 기법을 사용하여 해결할 수 있습니다.

 

연속된 1의 최대 길이를 구하지만 최대 k개의 0을 1로 뒤집을 수 있습니다.

즉, 0이 k개 이하인 가장 긴 구간을 찾는 문제입니다.

 

슬라이딩 윈도우를 사용하여 left와 right 두 포인터로 구간을 확장 및 축소하면서 조건을 만족하는 최대 길이를 구해야 합니다.

 

  1. right 포인터를 이동하며 구간에 포함되는 숫자를 확인합니다.
  2. nums[right] == 0이면 사용할 수 있는 flip 횟수인 k를 1 감소시킵니다.
  3. 만약 flip 가능 횟수(k)가 음수가 되면 (0을 많이 포함한 경우) left 포인터를 오른쪽으로 이동시켜 구간을 줄입니다.
  4. 줄이면서 nums[left] == 0이면 flip 횟수 k를 다시 증가시킵니다.
  5. 매 반복마다 구간의 길이 (right - left + 1)를 계산해서 최대값을 갱신합니다.

 

 

시간 복잡도

  • O(N)

핵심 코드 삽입 및 설명

 

from typing import List

class Solution:
    def longestOnes(self, nums: List[int], k: int) -> int:
        left = 0  # 윈도우의 왼쪽 포인터
        max_length = 0  # 최대 연속 1의 길이

        # 오른쪽 포인터를 이동하면서 윈도우 확장
        for right in range(len(nums)):
            if nums[right] == 0:
                k -= 1  # 0을 만났을 때 flip 기회를 하나 사용

            # flip 기회를 초과한 경우 윈도우의 왼쪽을 이동시키며 0 제거
            while k < 0:
                if nums[left] == 0:
                    k += 1  # 왼쪽 포인터가 가리키는 값이 0이면 flip 기회 복구
                left += 1  # 왼쪽 포인터를 오른쪽으로 이동

            # 현재 윈도우의 길이를 계산하고 최대값 갱신
            max_length = max(max_length, right - left + 1)

        return max_length

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Study > 코딩 테스트' 카테고리의 다른 글

[LeetCode] 1493. Longest Subarray of 1's After Deleting One Element 해설 및 풀이 (Python)  (0) 2025.04.09
[LeetCode] 11. Container With Most Water 해설 및 풀이 (Python)  (0) 2025.04.08
[99클럽 코테 스터디 9일차 TIL] 백준 3986번 좋은 단어 해설 및 풀이 (Java, Python)  (0) 2025.04.08
[99클럽 코테 스터디 8일차 TIL] LeetCode 70. Climbing Stairs 해설 및 풀이 (Java)  (0) 2025.04.07
[프로그래머스] Lv.1 완주하지 못한 선수 해설 및 풀이 (Python)  (0) 2025.04.07
'Study/코딩 테스트' 카테고리의 다른 글
  • [LeetCode] 1493. Longest Subarray of 1's After Deleting One Element 해설 및 풀이 (Python)
  • [LeetCode] 11. Container With Most Water 해설 및 풀이 (Python)
  • [99클럽 코테 스터디 9일차 TIL] 백준 3986번 좋은 단어 해설 및 풀이 (Java, Python)
  • [99클럽 코테 스터디 8일차 TIL] LeetCode 70. Climbing Stairs 해설 및 풀이 (Java)
Dev Chu
Dev Chu
  • Dev Chu
    Log_Double 7
    Dev Chu
  • 전체
    오늘
    어제
    • LOG LIST (199)
      • log Double 7 (2)
        • notice (1)
        • 회고록 (1)
      • Study (111)
        • 과제 (2)
        • 코딩 테스트 (105)
        • 대규모 시스템 설계 기초 (4)
      • CS (10)
        • 자료구조 & 알고리즘 (4)
        • Design Pattern (2)
        • TIL (4)
      • FrontEnd (26)
        • HTML & CSS (16)
        • JavaScript & jQuery (9)
        • React (1)
      • BackEnd (24)
        • Java (4)
        • Python (6)
        • Database (0)
        • Spring (6)
      • Infra & DevOps (3)
        • AWS (3)
        • Git (8)
      • Project (3)
        • repo_bis (2)
        • WhiteMonday (1)
      • ETC (20)
        • TIP (13)
        • Error (5)
        • SQLD (2)
  • 블로그 메뉴

    • 코딩 테스트
  • 링크

    • GitHub
  • 공지사항

    • Log Double 7
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Dev Chu
[LeetCode] 1004. Max Consecutive Ones III 해설 및 풀이 (Python)
상단으로

티스토리툴바