문제 간략 설명

첫 줄에 N, 다음에 N개의 명제가 주어진다. 명제의 숫자는 정확하게 i개의 명제가 참이다 라는 뜻이다.

총 몇 개의 내용이 참인지 구해보자.

풀이 방법

  1. 입력값들을 map에 저장하면서 각 값이 몇 번 입력되었는지 카운팅
  2. map에서 key == value인 경우를 찾기 (명제가 참인 경우)
  3. 여러 개가 있으면 가장 큰 값을 출력해야 하므로, map의 정렬된 특성을 이용해 역순(rbegin부터)으로 순회
  4. 순회 중 0을 만나면 -1 출력 (0이 입력으로 들어왔다는 건 0개가 참이어야 하지만 0이 있으므로 모순)
  5. 순회를 모두 마쳐도 찾지 못하면 0을 출력 (참인 명제가 없음)

코드

#include <iostream>
#include <map>

using namespace std;

int N;
map<int, int> m;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N;

	for (int i = 0; i < N; i++) {
		int input;
		
		cin >> input;

		m[input]++;
	}

	for (auto iter = m.rbegin(); iter != m.rend(); iter++) {
		if (iter->first == iter->second) {
			cout << iter->first << endl;
			return 0;
		}
		if (iter->first == 0) {
			cout << "-1\\n";
			return 0;
		}
	}

	cout << "0\\n";

	return 0;
}

Key Points