처음에는 이런 방식의 투 포인터를 적용해보았다. (적용하다가 좀 꼬여서 코드가 정확하진 않다)
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
S = list(map(int, input().split()))
start_point = 0
for i, s in enumerate(S):
if s % 2 == 0:
start_point = i
break
if start_point == 0:
print(0)
else:
left = start_point
right = start_point
count = K
answer = 1
while right < N:
current_answer = 1
while right < N and count > 0:
right += 1
if S[right] % 2 == 1:
count -= 1
else:
current_answer += 1
answer = max(answer, current_answer)
while left < right and S[left + 1] % 2 == 1:
if S[left] % 2 == 1:
count += 1
else:
current_answer -= 1
answer = max(answer, current_answer)
right += 1
print(answer)
가장 긴 수열의 길이는 투 포인터로 재는 게 맞아 보였다. 다만 참고한 풀이처럼 그 안의 홀수 개수를 세는 다른 변수를 따로 두는 것이 더 간단한 방법이었을 것 같다.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
S = list(map(int, input().split()))
end = 0
odd = 0
tmp = 0
answer = 0
for start in range(N):
while odd <= K and end < N:
if S[end] % 2 == 1:
odd += 1
else:
tmp += 1
end += 1
if start == 0 and end == N:
answer = tmp
break
if odd == K+1:
answer = max(tmp, answer)
if S[start] % 2 == 1:
odd -= 1
else:
tmp -= 1
print(answer)
'알고리즘' 카테고리의 다른 글
[백준/파이썬] #15961 (0) | 2025.03.29 |
---|---|
[백준/파이썬] #1806 (0) | 2025.03.28 |
[백준/파이썬&자바] #2470 (0) | 2025.03.26 |
[백준/파이썬] #3151 (0) | 2025.03.24 |
[백준/파이썬] #1106 (0) | 2025.03.22 |