1813번 - 마지막 한마디
로직은 간단하게,
정확하게 2개의 말만 참이다 라고 했으면, 정확하게 2개의 말만 참이다 라는 문장이 딱 2번 나와야한다.
더 나오면 2개보다 크기 때문에 거짓이 되고, 적으면 작기 때문에 거짓이 된다.
즉 n 이란 값이 참이 되려면 n 이 n번 나와야 한다는 말이다.
따라서 나는 그냥 입력받은 값을 sort 하고 upper_bound 와 lower_bound 를 이용하여 값이 몇개 존재하는지를 카운트 헀다.
주의할 점은 모순이 생길 때 인데,
모순은 모든 값들이 다 거짓이고, 주어진 입력으로 0이 들어올 때이다.
0은 한번이라도 등장하면 모순이 된다. 0이 0번 있어야 하는데, 입력으로 들어오는 순간 0보다 커지기 떄문이다.
따라서 모순일 때만 따로 체크해주면 된다.
<정답 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; i++) { cin >> v[i]; } sort(v.begin(), v.end()); int ans = 0; bool mosun = false; int i = 0; while (i <= v[n - 1]) { int k; auto u = upper_bound(v.begin(), v.end(), i); auto l = lower_bound(v.begin(), v.end(), i); k = u - l; if (i == k) { if (i > ans) { ans = i; } } if (i == 0 && k != 0) { mosun = true; } i++; } if (ans == 0 && mosun) { cout << "-1\n"; } else { cout << ans << "\n"; } return 0; } | cs |
반응형