boj 22862번 문제를 통해 접하게된 짝수일때, 홀수일때 수를 경우의 수를 더하는 방법에 대하여.

예를들어 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문을 통한 분기로 나누어 가는게 아니라 

조금 더 간결한 형태로 바꿀 수 있다. 

 

  Comments,     Trackbacks