본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 24155번 : 得点 (Score)

by Haren 2022. 10. 8.

문제

先日,JOI 大学情報学科で入学試験が行われた.試験は 100 点満点であり,n 人の生徒が受験 した.JOI 大学では,合格最低点を決定するために,試験結果を元に各生徒に順位をつけるこ とにした.

n 人の生徒の得点が与えられたとき,各生徒の順位を求めるプログラムを作成せよ.ただし, 同じ得点の生徒がいる可能性があることに注意せよ.

 

해석

어제 JOI 대학교 정보학과에서 입학시험이 치뤄졌다. 시험은 100점 만점이며 n명의 학생이 시험을 봤다. JOI 대학교에서는 합격 최저점을 결정하기 위해 시험 성적을 토대로 각 학생에게 순위를 매기기로 했다.

n명의 학생의 성적이 주어졌을 때, 각 학생의 순위를 구하는 프로그램을 작성하여라. 그러나 동점자인 학생이 있을 가능성이 있을 수 있음에 주의하여라.

입력

入力の 1 行目には,生徒の人数 n (1 ≤ n ≤ 100000) が書かれて いる.続く n 行は生徒の得点を表す.i + 1 (1 ≤ i ≤ n) 行目には受験番号 i の生徒の得点 si (0 ≤ si ≤ 100) が書かれている.

해석

입력의 첫 번째 행에는 학생의 수 n이 주어진다. 이어지는 n개의 행에는 학생의 득점이 주어진다. i + 1 번째 행에는 수험번호 i인 학생의 점수 si가 주어진다.

출력

出力は,標準出力に行うこと.出力は n 行からなる.i 行目 (1 5 i 5 n) に受験番号 i の生徒の順位を出力せよ.

해석

출력은 표준출력으로. 출력은 i 번째부터 n번째의 행까지 수험번호 i인 학생의 순위를 출력한다.

Solved.ac 레벨

실버 V

풀이

#include <bits/stdc++.h>

using namespace std;

int n;
vector< pair< pair<int, int>, int> > score; // first : score, second : student num

bool cmp(const pair< pair<int, int>, int> &a, const pair< pair<int, int>, int> &b){
    return a.first.second < b.first.second;
}

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

    cin >> n;

    for(int i = 0; i < n; i++){
        int inputScore;
        cin >> inputScore;
        score.push_back(make_pair(make_pair(inputScore, i + 1), 0));
    }

    sort(score.begin(), score.end()); //first를 기준으로 정렬

    for(int i = 0; i < n; i++){
        int tmpCnt = 0;
        int tmp = score[i].first.first;

        for(int j = i + 1; j < n; j++){
            if(score[j].first.first > tmp){
                tmpCnt++;
            }
        }

        score[i].second += (tmpCnt + 1);
        
    }

    sort(score.begin(), score.end(), cmp);


    for(int i = 0; i < n; i++){
        cout << score[i].second << '\n';
    }

    return 0;

}

좀 복잡하긴 한데, vector<pair<pair<int,int>, int>> score 에 점수, 학생의 수험번호, 순위를 담았다.

.first.fisrt에는 학생의 점수, .first.second에는 학생의 수험번호, .second에는 학생의 순위를 각각 담았다.

처음으로 주어진 점수들로 정렬을 한 뒤, 순위를 결정하고, 다시 학생의 수험번호 순으로 정렬하여 출력을 했다.

 

동점자 처리는 다음과 같이 진행했다.

 

정렬을 하고나면 X점을 획득한 학생의 순위는 X점보다 높은 점수를 득점한 학생들의 수의 합 + 1과 같다.

문제의 예제를 살펴보면

6 //학생 수
100
90
80
90
100
65

이렇게 주어진 점수를 점수를 기준으로 오름차순 정렬을 하면 65, 80, 90, 90, 100, 100 순이 된다.

만약 X가 65라고 하였을때 65점을 득점한 학생의 순위는

(80점인 학생 수) + (90점인 학생 수) + (100점인 학생 수) + 1 (자기자신) = 1 + 2+ 2+ 1 = 6 위가 된다.

이렇게 하면 동점자를 동석차에 올릴 수 있다.

 

일본어를 좀 공부했다는 사람이 이 정도 문제를 못 풀겠냐 하고 달려든게 이틀이다.

코테를 준비할 때 외국 문제는 정말 굳이? 싶을 정도로 풀 이유가 있겠냐만은,, 일본어 학습자로서의 오기다.

동점자 처리가 너무 안되서 고심하다 이틀만에 풀고 말았다. 문제 자체는 크게 안 어려운게 맞는듯...

 

 

24155번: 得点 (Score)

先日,JOI 大学情報学科で入学試験が行われた.試験は 100 点満点であり,n 人の生徒が受験 した.JOI 大学では,合格最低点を決定するために,試験結果を元に各生徒に順位をつけるこ とに

www.acmicpc.net