[백준] 1205번 : 등수 구하기 (C++) - 실버 4
링크 : https://www.acmicpc.net/problem/1205
해당 문제는 주어진 세 개의 입력값에 대하여 조건에 맞는 등수를 출력하는 문제다.
문제 해결 시 고려 사항이다.
- N : 기존에 등록된 점수의 개수
- S : 태수의 새로운 점수 → 조건에서 제시되지 않아 사용된 임시 변수
- 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';
}