문제링크 : https://www.acmicpc.net/problem/28250
28250번: 이브, 프시케 그리고 푸른 MEX의 아내
첫째 줄에 정수 $N$이 주어진다. ($2 \le N \le 200\,000$) 둘째 줄에 $N$개의 정수 $A_1, A_2, \dots, A_N$이 공백으로 구분되어 주어진다. ($0 \le A_i \le 100\,000$)
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int arr[200002];
ll cnt[3];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i];
if(arr[i]==0) cnt[0]++; //0의 갯수
else if(arr[i]==1) cnt[1]++; //1의 갯수
else cnt[2]++; //2이상 갯수
}
cout << cnt[0] * (cnt[0]-1)/2 + cnt[0]*cnt[1]*2 + cnt[0]*cnt[2]; //0끼리 만남, 0과 1만남, 0과 2이상 만남
return 0;
}
문제를 살펴보면 아래와 같은 내용을 파악할 수 있다.
Ai = 1, Aj = 1 : MEX(Ai, Aj) = 0
Ai = 1, Aj = 0 : MEX(Ai, Aj) = 2
Ai = 0, Aj = 0 : MEX(Ai, Aj) = 1
Ai = 2, Aj = 0 : MEX(Ai, Aj) = 1
그러면 Ai와 Aj가 모두 0인 경우는 0의 갯수를 m이라 했을 때 mC2인 것을 알 수 있다.
Ai가 0, Aj가 1일때는 Ai의 갯수 * Aj의 갯수에 MEX(Ai, Aj)의 값이 2이기에 추가로 2를 곱해준다.
Ai가 2, Aj가 0일때는 Ai의 갯수 * Aj의 갯수를 곱해주면 된다.
Ai가 1, Aj가 1일때는 마찬가지로 Ai의 갯수 * Aj의 갯수이나 MEX(Ai, Aj)의 값이 0이기에 더해줄 필요가 없다.
따라서 위 3가지만 (mC2, cnt[0]*cnt[1]*2 , cnt[0]*cnt[2])의 경우만 더해서 출력해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 28138번] 재밌는 나머지 연산 (C++) (0) | 2023.07.30 |
---|---|
[백준 16173번] 점프왕 쩰리 (Small) (C++) (0) | 2023.07.28 |
[백준 28324번] 스케이트 연습 (C++) (0) | 2023.07.24 |
[백준 28238번] 정보 선생님의 야망 (C++) (0) | 2023.07.23 |
[백준 9656번] 돌 게임 2 (C++) (0) | 2023.07.22 |