https://www.acmicpc.net/problem/1205
쉬운 문제인데 진정한 문제는.. 반례 찾기였다..^^ㅋㅋㅋㅋㅋㅋㅋ
처음에는 진짜 하.. 너무 하기 싫어서 그냥 다른 사람 코드 볼까 했는데 유혹을 참고 한번 반례를 다 찾아보자!
몇 시간이 걸려도 내가 찾고 만다;;;;;라는 마음으로 하나하나 적으면서 생각해봤다.
일단 제일 중요한 조건 (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 |