https://www.acmicpc.net/problem/1205
1205번: 등수 구하기
첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보
www.acmicpc.net
쉬운 문제인데 진정한 문제는.. 반례 찾기였다..^^ㅋㅋㅋㅋㅋㅋㅋ
처음에는 진짜 하.. 너무 하기 싫어서 그냥 다른 사람 코드 볼까 했는데 유혹을 참고 한번 반례를 다 찾아보자!
몇 시간이 걸려도 내가 찾고 만다;;;;;라는 마음으로 하나하나 적으면서 생각해봤다.
일단 제일 중요한 조건 (10 <=P <=50, 0 <=N <=P)
(*ts: 태수 점수)
1. P 리스트가 꽉 찬 경우
1) ts가 마지막 점수보다 작거나 같은 경우: -1 출력
2) ts가 점수들의 중간 혹은 맨 앞 위치라면: for문에서 ans 증가하면서 점수 위치 찾으면 됨.
2. P 리스트에 여유가 있는 경우
1) n == 0 인 경우, ts가 무엇이든 1 출력
2) n!= 0 인 경우
2-1) ts가 중간 && 맨 앞인 경우 : for문에서 ans 증가하면서 점수 위치 찾으면 됨.
2-2) ts가 맨 뒤인 경우: for문이 끝난 후, ans++ 한번 더
여기서 꼭 잊지 말아야 할 것은 for문을 돌면서 나보다 작거나 같은 게 나오면 ans++하고 바로 출력하고 끝내야 한다. 아니면 for문에서 나와서 마지막에 ans++ 한번 더 할 수 있음..
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, ts, p, ans = 0;
int score[50];
cin >> n >> ts >> p;
for(int i=0; i<n; i++) cin >> score[i];
if(p == n && score[n-1] >= ts) { //1-1
cout << -1 << '\n';
return 0;
}
if(n == 0){ //2-1
cout << 1 << '\n';
return 0;
}
for(int i=0; i<n; i++){
if(score[i] > ts) ans++;
else if(score[i] == ts || score[i] < ts){
ans++;
cout << ans << '\n';
return 0;
}
}
if(score[n-1] >= ts && ans < p) ans++;
cout << ans << '\n';
return 0;
}
뭔가 굉장히 지저분한 코드인 것 같다... 흑흑
그래서 다른 사람의 코드는 어떤지 확인해보려고 한다.
https://sanghyu.tistory.com/25
#include <iostream>
using namespace std;
int main() {
int N, score, P;
int rank[100];
//입력단
cin >> N >> score >> P;
for (int i = 0; i < N; i++) {
cin >> rank[i];
}
//계산단
int cnt = 0;
int my_rank = 1;
for (int i = 0; i < N; i++) {
if (score < rank[i]) my_rank += 1;
else if (score == rank[i]) my_rank = my_rank;
else break;
cnt++;
}
if (cnt == P) my_rank = -1;
if (N == 0) my_rank = 1;
cout << my_rank;
return 0;
}
우왕... 나는 아직 멀었나 보다..😱
이렇게 깔끔하게...
cnt를 통해서 몇 개의 스코어가 리스트업 되었는지 세고, P와 같다면 -1을 출력한다..
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 2529번: 부등호 (0) | 2022.07.25 |
---|---|
[백준/c++] 1449번: 수리공 항승 (0) | 2022.07.25 |
[백준/c++] 7576번: 토마토 (0) | 2022.07.24 |
[백준/c++] 10026번: 적록색약 (0) | 2022.07.24 |
[백준/c++] 2583번: 영역 구하기 (0) | 2022.07.23 |