코딩 테스트

[백준] 1205번 : 등수 구하기 (C++) - 실버 4

taks-embdd 2025. 2. 10. 15:59

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

 

[ 그림 1 ] 1205번 문제 전문

 

해당 문제는 주어진 세 개의 입력값에 대하여 조건에 맞는 등수를 출력하는 문제다.

 

문제 해결 시 고려 사항이다.

 

  1. N : 기존에 등록된 점수의 개수
  2. S : 태수의 새로운 점수 → 조건에서 제시되지 않아 사용된 임시 변수
  3. P : 리스트에 갱신 가능한 점수의 총 개수

이 문제를 해결하기 위한 가장 큰 방향성은 조건에 맞춰 점수를 갱신하되, 기존의 점수 중 갱신하려는 점수와 같은 것이 있다면 조건에 맞춰 갱신 여부를 결정하는 조건을 작성해야 한다는 것이다.

 

먼저 변수를 초기화한다.

/*
N : 기존에 등록된 점수의 개수
S : 태수의 새로운 점수
P : 등록 가능한 점수의 최대 개수
*/

int N, S, P;
int place = 1; // 갱신할 점수의 등수
int cnt = 0;   // 최대 갱신 가능 개수 초과 여부 확인용 변수

vector<int> score_list;

 

cnt 변수는 최대 갱신 가능 개수인 P를 넘지 않도록 하기 위한 변수이며, 만약 cnt가 P와 같아진다면, 비교를 멈추기 위해 선언한다.

 

 

다음으로 메인 함수의 점수를 저장할 벡터인 score_list에 주어진 입력값을 저장하는 코드이다.

cin >> N >> S >> P;

for (int i = 0; i < N; i++) {
    int k; // 기존 점수 삽입용 임시 변수
    cin >> k;
    score_list.push_back(k);
}

위의 코드처럼 작성하면 띄어쓰기를 기준으로 주어진 N값 만큼 입력값을 받을 수 있다.

 

 

마지막으로 새롭게 갱신할 점수의 등수를 출력하기 위한 반복문 및 조건문이다.

for (int i = 0; i < N; i++) {
    if (score_list[i] > S) {
        place++;
    }
    else if (score_list[i] == S) {
        place = place;
    }
    else {
        break;
    }
    cnt++;
}

if (N == 0) { // 등록된 점수가 없는 경우
    place = 1;
}

if (cnt == P) {
    place = -1;
}

cout << place << '\n';

 

먼저 반복문은 N만큼만 진행한다.

 

설령 P가 N보다 클지라도, 어짜피 지금 당장 등록된 점수의 개수는 N개이기 때문에 비교를 위한 반복문을 N번 이상 진행할 필요가 없다.

if (score_list[i] > S) {
    place++;
}

 

만약 갱신할 점수보다 기존의 i번째 점수가 크다면 다음 점수와 비교해야되기 때문에 등수를 하나 올리면서 다음 점수와의 비교로 넘어간다.

 

 

 

else if (score_list[i] == S) {
    place = place;
}

 

만약 갱신할 점수와 기존의 i번째 점수가 같다면, 등수는 동결된다.

 

그 외에는 갱신할 점수가 기존의 점수보다 큰 경우이므로 반복문을 멈춘다.

 

 

 

if (N == 0) { // 등록된 점수가 없는 경우
    place = 1;
}

if (cnt == P) {
    place = -1;
}

cout << place << '\n';

 

마지막으로 N이 0이라면 기존에 등록된 점수가 없으므로 갱신할 점수가 첫 번째 점수가 된다. 따라서 1을 저장한다.

 

만약 점수가 갱신 가능한 조건에 한 번도 걸리지 않았다면, cnt만 늘어날 것이고 이게 만약 최대 갱신 가능 개수인 P와 같다면 -1을 출력해야 하므로 등수 저장 변수에 -1을 저장한다.

 

이 과정이 모두 끝났다면 등수 변수의 값을 출력한다.

 

코드 전문이다.

#include <iostream>
#include <vector>

using namespace std;

/*
N : 기존에 등록된 점수의 개수
S : 태수의 새로운 점수
P : 등록 가능한 점수의 최대 개수
*/
int N, S, P;
int place = 1;
vector<int> score_list;

void fast_io() {
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
}

int main() {
    fast_io();

    cin >> N >> S >> P;

    for (int i = 0; i < N; i++) {
        int k; // 기존 점수 삽입용 임시 변수
        cin >> k;
        score_list.push_back(k);
    }

    int cnt = 0;
    for (int i = 0; i < N; i++) {
        if (score_list[i] > S) {
            place++;
        }
        else if (score_list[i] == S) {
            place = place;
        }
        else {
            break;
        }
        cnt++;
    }

    if (N == 0) { // 등록된 점수가 없는 경우
        place = 1;
    }

    if (cnt == P) {
        place = -1;
    }

    cout << place << '\n';
}