fork download
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5. #include <queue>
  6. #include <map>
  7. #include <iostream>
  8. #include <string>
  9. #include <math.h>
  10. #include <set>
  11. #include <list>
  12. #include <climits>
  13. #include <string.h>
  14. #include <deque>
  15. #include <functional>
  16. using namespace std;
  17. typedef long long ll;
  18. #define INF 1000000000
  19. typedef pair<int, int> P;
  20. typedef pair<ll, pair<ll, ll>> PP;
  21. typedef pair<pair<int, int>, pair<int, int>> PPP;
  22. int gox[4] = { 0,0,1,-1 };
  23. int goy[4] = { 1,-1,0,0 };
  24. int n;
  25. map<int, int> check;
  26. bool numvisited[100005];
  27. bool visited[100005];
  28. int main() {
  29. scanf("%d", &n);
  30. vector<int> v;
  31. vector<int> origin;
  32. for (int i = 1; i <= n; i++) origin.push_back(i);
  33. for (int i = 1; i <= n; i++) {
  34. int num;
  35. scanf("%d", &num);
  36. v.push_back(num);
  37. }
  38. sort(v.begin(),v.end());
  39. vector<int>::iterator it;
  40. for (int i = 1; i <= n; i++) {
  41. it = lower_bound(v.begin(), v.end(), i);
  42. if (*it == i) {
  43. numvisited[i] = true; // 1~n까지의 숫자들을 체크
  44. }
  45. }
  46. for (int i = 0; i < v.size(); i++) {
  47. it = lower_bound(origin.begin(), origin.end(), v[i]);
  48. if (it == origin.end()) continue;
  49. if (*it == v[i]) {
  50. if (check.count(v[i]) == 0) {
  51. check[v[i]] = 1; // 입력받은 배열에서 같은 숫자가 있는지 체크
  52. visited[i] = true;
  53. }
  54. }
  55. }
  56. vector<int> real,real2;
  57. for (int i = 0; i < v.size(); i++) {
  58. if (!visited[i]) {
  59. real.push_back(v[i]);
  60. }
  61. }
  62. for (int i = 1; i <= n; i++) {
  63. if (!numvisited[i]) {
  64. real2.push_back(i);
  65. }
  66. }
  67. ll sum = 0;
  68. for (int i = 0; i < real.size(); i++) {
  69. sum += abs(real[i] - real2[i]); // 그차이를 누적시킴
  70. }
  71. printf("%lld\n", sum);
  72. return 0;
  73. }
Success #stdin #stdout 0s 15432KB
stdin
7
5
5
3
1
3
5
5
stdout
5