예를들어 arr[i]%2의 값은, arr[i]가 짝수일때 0을 가지게 될 것이고, arr[i]가 홀수일때 1일 가지게 될 것이다
그렇기 때문에 홀수의 경우들을 카운트 하는 변수에는
cnt+=arr[i]%2 형태로 코드를 작성하면, 홀수인 경우들에 대해서는 cnt에 값이 +1씩 증가하면서 쌓이게 된다
이런 형태를 사용하여서 홀수의 경우를 카운트 하는 코드를 작성해서 문제를 풀어야 하는 경우는
#include <bits/stdc++.h>
using namespace std;
int n, k, ans;
int arr[1'000'005];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> arr[i];
int cnt = 0;
if (arr[0] % 2 == 1) cnt++;
int en = 0;
for (int st = 0; st < n; st++) {
while (en < n - 1 && cnt + arr[en + 1] % 2 <= k) {
en++;
cnt += arr[en] % 2;
}
ans = max(ans, en - st + 1 - cnt);
cnt -= arr[st] % 2;
}
cout << ans;
}
위와 같은 형태처럼 홀수인지 짝수인지 판단, 그리고 홀수인 경우 +1을 하는 코드를
cnt+arr[en+1]%2<=k;
혹은
cnt-=arr[st]%2; 형태로 작성할 수 있다.
이런 경우는
if(arr[st]%2!=0){
//경우 1에 따른 코드 내용
}
else{
//경우 2에 따른 코드의 내용
}
형태의 코드로도 작성할 수 있으나, 위의 코드처럼 arr[st]%2의 값이 경우에 따라(홀수면 1, 짝수면 0) 1과 0으로 나온다는걸 통해서 저 연산 자체의 값을 더해주면 깔끔하게 해결할 수 있다.
그리고 이번 문제의 풀이의 경우는
en<n-2 형태로 잘못 파악하고 지속적으로 생각이 벗어나지 못해서 끝까지 잘못된 범위로 접근했는데,
en<n-1 형태가 int 타입 en에서 n-2까지 라는걸 잘 이해하도록 하고 , 다음에도 이런 형태의 문제가 나오면
범위를 en<n-1로 설정하면 된다는걸 잘 파악하도록 하자.
++++++++++++
if(arr[0] % 2 == 1) cnt++;
형태로 작성하는 코드를
cnt += a[0] % 2;
형태로 작성할 수 있는 것이다.
이런 형태로 작성할 수 있다는걸 이용해서 코드를 if문을 통한 분기로 나누어 가는게 아니라
조금 더 간결한 형태로 바꿀 수 있다.
'알고리즘 > BOJ' 카테고리의 다른 글
boj 13414번 문제를 통해 익히는 unordered_map의 find() 함수와, min() 함수에 사용하는 (int) size() 함수에 대하여. (0) | 2023.06.20 |
---|---|
boj 7785번 문제를 통해 접하게된 unordered_set과 sort에 관하여. (0) | 2023.06.20 |
boj 2003번 수들의 합 2 문제를 풀다가 접하게된 zsh: bus error 와 옳바른 코드 형태에 관하여. (0) | 2023.06.17 |
boj 1644번 문제의 풀이중 만나게된 런타임에러(OutOfBounds)상황에 대하여. (0) | 2023.06.16 |
boj 1806번 문제를 통해서 본 for 문 속에서 st++;을 추가한 코드의 실행에서의 st의 증가에 관하여. (0) | 2023.06.15 |