[Programmers] 상호평가

김민석·2021년 10월 7일
0

프로그래머스

목록 보기
21/30

점수 중 최고점이나 최저점을 찾아 그게 자기가 준 점수인지 판단하는 문제이다.

문제풀이 전략
우선 주어진 조건을 잘 생각해 봐야 한다.

각 학생이 준 점수가 주어진다.

그리고 판단은 그 학생이 받은 점수를 통해 해야한다.

만약 본인이 받은 점수 중 본인이 준 점수가 가장 크거나 작다면 성적에서 제외시키는 것이다.

즉, 입력은 행으로 받는데 판단은 열로 해야 한다는 의미이다.

이 부분만 잘 고려한다면 크게 어렵지 않은 문제였다.

나는 먼저 받은 점수를 정렬한 후 맨 앞과 그 다음, 맨 뒤와 그 이전을 비교하여 최고, 최저점이 하나인지 판단하고 문제를 풀었다.
(정렬 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

profile
김민석의 학습 정리 블로그

0개의 댓글