Patrick's Devlog

[BOJ/C++] 등수 구하기(1205번) 본문

Study/Algorithms Practice

[BOJ/C++] 등수 구하기(1205번)

Patrick_ 2022. 10. 4. 16:56

1. 개요

https://www.acmicpc.net/problem/1205

 

1205번: 등수 구하기

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보

www.acmicpc.net

1-1. 설명

태수가 즐겨하는 게임은 랭킹 리스트가 존재한다. 매번 게임할때마다 얻는 점수가 비오름차순으로 저장되어 있다. 이 랭킹 리스트 등수는 보통 위에서 몇번째있는 점수인지로 결정한다. 하지만, 점수가 같을땐 그 점수의 등수 중 가장 작은 등수가 된다.

랭킹 리스트에 올라갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지며, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇등하는지 구하는 프로그램을 작성한다. 랭킹리스트에 올라갈 수 없을정도로 점수가 낮으면 -1을 출력하고, 랭킹 리스트가 꽉차있을때 새 점수가 이전 점수보다 좋을때만 점수가 바뀐다.

1-2. 제한 사항

 - 첫 줄에 현 랭킹 리스트 개수 N, 태수의 새로운 점수, 최대 랭킹 리스트 개수 P가 주어짐

 - P는 10 이상 50 이하 정수, N은 0 이상 P 이하 정수

 - 점수는 2,000,000,000 이하 자연수 or 0

 - 둘째 줄에 N개수 만큼 점수 주어짐, 만약 N이 0일시 둘째줄은 출력 X


2. 구현

2-1. 풀이

이래저래 조건들이 조금 복잡한 문제이다. 조건을 잘 고려해서 코딩하면 금방 할 수 있다. 조건을 잘 설계해서 풀면 된다. 

2-2. 코드

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

int ranking[51];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int N, score, P, rankNum = 1;
    bool outputFlag = false;
    cin >> N >> score >> P;
    for (int i = 1; i <= N; i++) cin >> ranking[i];

    if (score <= ranking[P] && (P == N)) cout << "-1"; // 랭킹 리스트가 가득차 있고, 점수가 낮을 때
    else {
        if (N == 0) cout << rankNum; // 랭킹 리스트가 비었을 때
        else {
            for (int i = 1; i <= N; i++) {
                if (ranking[i] > score) { // 점수가 낮을 때
                    rankNum = i + 1;
                }
                else if (ranking[i] < score) { // 점수가 현 랭킹 점수보다 높을 때
                    cout << rankNum;
                    outputFlag = true;
                    break;
                }
                else if (ranking[i] == score) { // 점수와 현 랭킹 점수가 동일할 때
                    if (i == N) { // 동일한 점수가 끝까지 리스트에 저장돼있을 때
                        cout << rankNum;
                        outputFlag = true;
                    }
                    else continue;
                }
            }
            if (!outputFlag) { // 아직 랭킹을 출력하지 않았을 때
                cout << rankNum;
            }
        }
    }
    return 0;
}