점수 중 최고점이나 최저점을 찾아 그게 자기가 준 점수인지 판단하는 문제이다.
문제풀이 전략
우선 주어진 조건을 잘 생각해 봐야 한다.
각 학생이 준 점수가 주어진다.
그리고 판단은 그 학생이 받은 점수를 통해 해야한다.
만약 본인이 받은 점수 중 본인이 준 점수가 가장 크거나 작다면 성적에서 제외시키는 것이다.
즉, 입력은 행으로 받는데 판단은 열로 해야 한다는 의미이다.
이 부분만 잘 고려한다면 크게 어렵지 않은 문제였다.
나는 먼저 받은 점수를 정렬한 후 맨 앞과 그 다음, 맨 뒤와 그 이전을 비교하여 최고, 최저점이 하나인지 판단하고 문제를 풀었다.
(정렬 O(nlogn))
하지만 이런 접근 방법이 아닌 자기점수를 기준으로 자기점수보다 크거나 같은 점수와 작거나 같은 점수의 갯수를 세서 그 갯수가 0이면 최고, 최저점인지 판단할 수 있다.
(O(n))
아래의 방법을 사용하면 좀 더 효율적으로 문제를 풀 수 있을 것이라는 아쉬움이 있었다.
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<vector<int>> scores) {
string answer = "";
vector<vector<int>> v;
for(int i=0;i<scores.size();i++){
vector<pair<int,int>> tmp;
vector<int> sc;
for(int j=0;j<scores.size();j++){
tmp.push_back(make_pair(scores[j][i], j));
sc.push_back(scores[j][i]);
}
sort(tmp.begin(), tmp.end());
if(tmp[0].first != tmp[1].first){
if(tmp[0].second == i){
sc[i] = -1;
}
}
if(tmp[tmp.size()-1].first != tmp[tmp.size()-2].first){
if(tmp[tmp.size()-1].second == i){
sc[i] = -1;
}
}
v.push_back(sc);
}
for(int i=0;i<v.size();i++){
int flag = 0;
int sum = 0;
for(int j=0;j<v.size();j++){
if(v[i][j] == -1){
flag = -1;
continue;
}
sum += v[i][j];
}
int total = sum/(v.size()+flag);
if(total >= 90)
answer += 'A';
else if(total >= 80)
answer += 'B';
else if(total >= 70)
answer += 'C';
else if(total >= 50)
answer += 'D';
else
answer += 'F';
}
return answer;
}
출처 : https://programmers.co.kr/learn/courses/30/lessons/83201