티스토리 뷰

백준 스터디

백준 등수 구하기 (1205번) C++

박완희버서커 2025. 8. 27. 15:48
반응형
백준 등수 구하기 (1205번) C++ 풀이

백준 등수 구하기 1205 C++


문제 설명


백준 온라인 저지 1205번 등수 구하기 문제는 다음과 같은 상황을 다룹니다.

  • 랭킹 리스트에는 최대 P개의 점수가 비오름차순(=내림차순)으로 저장되어 있습니다.
  • 새로운 점수가 들어왔을 때, 이 점수가 몇 등에 위치하게 되는지 구하는 문제입니다.
  • 만약 리스트가 꽉 차 있다면, 새 점수가 마지막 점수보다 커야만 들어갈 수 있습니다.
  • 동점일 경우에는 “같은 점수 중 가장 높은 순위”를 공유하게 됩니다.
  • 리스트에 들어갈 수 없다면 -1을 출력합니다.


접근 방법


  1. 입력 처리
    • N: 현재 리스트에 있는 점수 개수
    • new_score: 새 점수
    • P: 랭킹 리스트 최대 크기
  2. 등수 계산
    • 랭킹 리스트는 내림차순이므로, 위에서부터 차례대로 비교하면서 새 점수보다 큰 점수 개수만큼 등수를 밀립니다.
    • new_score < arr[i]이면 rank++
    • new_score ≥ arr[i]가 되는 순간 현재 rank가 확정됩니다.
  3. 출력 조건
    • 리스트가 비어 있다면 → 무조건 1등.
    • 리스트 크기 N < P라면 → 무조건 들어갈 수 있음.
    • 리스트 크기 N == P라면 → 마지막 점수(arr[N-1])보다 커야 들어갈 수 있음.
    • 들어갈 수 없으면 -1.


C++ 코드


#include <iostream>
using namespace std;
int main(void)
{
    int N, new_score, P;
    cin >> N >> new_score >> P;
    int arr[50];
    for(int i=0; i<N; i++) cin >> arr[i];

    // 리스트가 비어 있으면 바로 1등
    if(N == 0) {
        cout << 1 << endl;
        return 0;
    }

    // 등수 계산
    int rank = 1;
    for(int i=0; i<N; i++) {
        if(new_score < arr[i]) rank++;
        else break; // 내림차순이므로 한 번 위치가 정해지면 멈춤
    }

    // 리스트 크기에 따라 조건 분기
    if(N < P) {
        cout << rank << endl;
    } else {
        if(new_score > arr[N-1]) cout << rank << endl;
        else cout << -1 << endl;
    }

    return 0;
}


코드 설명


  • if (N == 0)
    리스트가 비어 있다면 새 점수가 무조건 1등입니다.
  • 등수 계산
    for문에서 내림차순 리스트를 순회하면서, 새 점수보다 큰 값이 나올 때마다 등수를 하나씩 밀립니다. 처음으로 new_score ≥ arr[i]가 되는 순간 그 자리에 들어갈 수 있으므로 break 합니다.
  • 리스트 크기 체크
    • N < P → 아직 자리가 남았으므로 들어갈 수 있습니다.
    • N == P → 마지막 원소 arr[N-1]보다 엄격히 커야 들어갈 수 있습니다.
    • 동점일 경우에는 -1을 출력해야 합니다.


핵심 포인트


  • 내림차순 정렬이므로, 등수를 찾을 때 끝까지 볼 필요가 없습니다.
  • 다만, **리스트가 꽉 찼을 때 마지막 원소와 비교하는 조건**이 중요합니다.
  • 이 조건을 놓치면 동점일 때 잘못된 답이 나옵니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함
반응형