본문 바로가기
코딩테스트 공부/Programmers

[C++] 위클리챌린지 2주차 83201

by 메정 2021. 8. 22.

📌2주차 상호평가

/* 해당 문제 설명은 링크로 대체한다. */

문제가 어렵진 않으나 고려사항이 많아 조심해야 하는 문제!

📌풀이

문제를 처음 보고 오 1시간 컷으로 풀어보자 하고 시작했는데 약 2시간 넘게 걸린 것 같다 ㅎㅎ ..........

문제 설명에서는 행별로 평균을 구해서 학점을 매기는 방식이었는데
밑에 입출력 예시에서는 열별로 평균을 구해서 학점을 매기는 방식으로 설명되어있다.

사실 행열이 같고, 행열 모두 다른 사람 + 자기 자신이 점수를 매긴 것이기 때문에 열별로 평균을 구하는 식으로 풀이했다.

처음에 tc 10, 12, 16 실패하여 테스트케이스를 추가해서 문제를 풀어보았는데 유일한 최소점, 최고점인 경우를 고려하지 않았던 것 같다.
그래서 count() 함수를 써서 유일한 최소점, 최고점인 경우를 고려하려고 시도해보았지만, 원래 있던 코드도 안되어서 아예 다시 접근하였다.

먼저 행, 열의 사이즈가 동일하기 때문에 SIZE라는 변수로 빼두었다. 열별로 행을 더해 평균을 구하는 방식으로 구하였다.
이 후 for문을 돌면서 max, min의 값을 구하였다.

첫 번째 for문은 열
이 안에서 max, min, value, sum 변수를 정의하여 열이 바뀔 때마다 갱신되도록 하였다.

두 번째 for문은 행
여기서 만약 i == j가 같다면 자기 자신이니까 continue 하고,
maxmin을 구하고 sum에는 자기 자신을 제외한 모든 값을 저장하도록하였다.

두 번째 for문이 종료되면, 여기가 !핵심!
value변수를 자기 자신의 값으로 정의 했기 때문에, 자기 자신이 max 보다 크거나 같다면 제외하고 평균을 구하도록 하였고 아니라면 sum에 자기자신을 더하여 평균을 구하였다.

📌코드

#include <string>
#include <vector>
using namespace std;

string answer = "";
void getAnswer(int ans)
{
    if (ans >= 90)
        answer.push_back('A');
    else if (ans >= 80 && ans < 90)
        answer.push_back('B');
    else if (ans >= 70 && ans < 80)
        answer.push_back('C');
    else if (ans >= 50 && ans < 70)
        answer.push_back('D');
    else if (ans <= 50)
        answer.push_back('F');
}

string solution(vector<vector<int>> scores)
{
    int SIZE = scores.size(); //row.size == col.size 같은 배열

    for (int i = 0; i < SIZE; i++){ //col
        int max = 0, min = 10000, value = scores[i][i]; //최고점, 최저점, 자기자신
        int sum = 0;    //합 ... avg를 구하기 위해

        for (int j = 0; j < SIZE; j++){ //row
            if (i == j)
                continue; //자기 자신 생략
            if (scores[j][i] >= max)
                max = scores[j][i];
            if (scores[j][i] <= min)
                min = scores[j][i];
            sum += scores[j][i]; //자기자신을 제외한 행의 값을 더해
        }if ((value > max) || (min > value)){ //자기자신 값보다 크거나, 작은 경우 제외
            getAnswer(sum / (SIZE - 1));
            continue;
        }
        sum += value;
        getAnswer(sum / SIZE);
    }

    return answer;
}

회고

위클리 문제 3주차가 등장하기 전까지만 해도 기본 개념에 대한 문제인 것 같아서 좋았다 .....
급 난이도 상승으로 아직 3주차를 풀지 못했다 ^^ .....

댓글