반갑습니다!

[백준] 2012 등수매기기 본문

알고리즘 문제 풀이

[백준] 2012 등수매기기

김덜덜이 2020. 9. 23. 11:28
2012번: 등수 매기기
 
www.acmicpc.net

풀이

문제의 관건은 각 학생들이 본인이 희망하는 등수와 실제 등수의 차이가 적어야한다는 점이다. 아이러니하지만 5등을 희망하는 선수가 1등을 하면 불만도 4가 쌓인다. 5등을 희망하는 학생은 4등이나 5등, 6등 등을 받는 것이 훨씬 좋다는 얘기이다. 따라서 희망 등수를 오름차순으로 정렬한 뒤, 1등부터 차례로 순위를 부여해주면 된다.

코드

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

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

    int n;
    vector<int> s;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        s.push_back(tmp);
    }
    sort(tmp.begin(), tmp.end());

    long long answer = 0;
    for (int i = 0; i < n; i++) {
        answer += (long long)abs(s[i] - (i + 1));
    }
    cout << answer << '\n';
    return 0;
}

Python3

import sys

n = int(sys.stdin.readline().rstrip())
s = []
for _ in range(n):
    s.append(int(sys.stdin.readline().rstrip()))
s.sort()
answer = 0
for i in range(n):
    answer += abs(s[i] - (i + 1))
print(answer)