본문 바로가기

Algorithm/Implementation

(C++) - 프로그래머스(위클리 챌린지) : 2주차

반응형

https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 2주차

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

단순 구현문제였습니다.

 

 

📕 풀이방법

📔 풀이과정

 1. 한 열에 대해 최댓값, 최솟값을 찾습니다. 

 

 2. 중복 여부를 확인하기 위해 최댓값, 최솟값들의 개수를 각각 세줍니다.

 

 3. 다시 한 열에 대해 최소 또는 최댓값이 유일하다면 sum에 더하지 않고 평균을 구할 때도 나누는 인원수에서 1을 제해야합니다. 따라서 flag를 세워준 뒤 continue해줍니다.

 

 4. 해당 학생의 평균점수를 보고 학점을 산출한 뒤 answer에 push_back해줍니다.

 

📔 정답출력

 최종 학생별 학점인 answer문자열을 반환합니다.

 


📕 Code

#include <bits/stdc++.h>
using namespace std;

char getDegree(double avg){
    if(avg >= 90.0) return 'A';
    if(avg >= 80.0) return 'B';
    if(avg >= 70.0) return 'C';
    if(avg >= 50.0) return 'D';
    return 'F';
}

string solution(vector<vector<int>> scores) {
    string answer = "";
    for(int i = 0; i < scores.size(); i++){
        int minScore = 0x3f3f3f3f;
        int maxScore = 0;
        int minCnt = 0;
        int maxCnt = 0;

        for(int j = 0; j < scores[i].size(); j++){
            minScore = min(minScore, scores[j][i]);
            maxScore = max(maxScore, scores[j][i]);
        }

        
        for(int j = 0; j < scores[i].size(); j++){
            if(scores[j][i] == minScore) minCnt++;
            if(scores[j][i] == maxScore) maxCnt++;
        }
        double sum = 0;
        int flag = 0;

        for(int j = 0; j < scores[i].size(); j++){
            if(j == i){
                if(scores[j][i] == minScore && minCnt == 1) { flag = 1; continue; }
                if(scores[j][i] == maxScore && maxCnt == 1) { flag = 1; continue;}
            }
            sum += scores[j][i];
        }

        double avg = sum / (scores.size() - flag);
        answer.push_back(getDegree(avg));

    }

    return answer;
}