Algorithm/프로그래머스

[프로그래머스] 상호 평가

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

 

상호 평가로 학생들에게 점수를 부여한다.

자신에게 부여한 점수가 유일한 최고점 혹은 유일한 최저점일 경우 제외 시키고

그 외에는 모두 합산하여 평균을 구하고 문자열로 점수를 반환하시오.

 

 

 

class Solution {
    public String solution(int[][] scores) {
        String answer = "";
        int row = scores.length;
        int column = row;
        int[] selfScores = new int[row];
        float[] average = new float[column];
        
        // 1. 자신에게 부여한 점수를 구하기 selfScore O(N^2)
        // 2. self Score를 가지고 그 외 점수들과 비교 O(N^2)
        // 3. 제외 혹은 합산
        // 4. 평균
        // 5. 평균을 가지고 점수로 치환
        
        for(int i = 0; i < row; i++){
            for(int j = 0; j < row; j++){
                if(i == j) selfScores[i] = scores[i][j];
            }
        }
        
        
        for(int idx = 0; idx < row; idx++) {
            boolean max = false;
            boolean min = false;
            boolean equal = false;
            int selfScore = selfScores[idx];
            for(int secondIdx = 0; secondIdx < column; secondIdx++) {
                int temp = scores[secondIdx][idx];
                if(idx != secondIdx) {
                    if(selfScore > temp) max = true;
                    if(selfScore < temp) min = true;
                    if(selfScore == temp) equal = true;
                    average[idx] += temp;
                }
            }
            if(max == true && min == true || equal == true) {
                average[idx] += selfScore;
                average[idx] /= row;
            }else {
              average[idx] /= (row - 1);  
            }
        }
        
        for(int idx = 0; idx < row; idx++) {
            switch((int)average[idx] / 10){
                case 10 : answer += "A"; break;
                case 9 : answer += "A"; break;
                case 8 : answer += "B"; break;
                case 7 : answer += "C"; break;
                case 6 : answer += "D"; break;
                case 5 : answer += "D"; break;
                default: answer += "F"; break;
            }
        }
        
        return answer;
        
    }
}

다른분 풀이

class Solution {
    public String solution(int[][] scores) {
        StringBuilder builder = new StringBuilder();
        for(int i=0; i<scores.length; i++) {
            int max = 0;
            int min = 101;
            int sum = 0;
            int divide = scores.length;
            for(int j=0; j<scores.length; j++) {
                int score = scores[j][i];
                if(i != j) {
                    if(score < min) {
                        min = score;
                    }
                    if(score > max) {
                        max = score;
                    }
                }
                sum += score;
            }
            if(scores[i][i] < min || scores[i][i] > max) {
                sum -= scores[i][i];
                divide--;
            }
            double score = (double) sum / divide;
            builder.append(score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 50 ? "D" : "F" );
        }
        return builder.toString();
    }
}

 

 

StringBuilder 및 중첩 삼항식 적용

class Solution {
    public String solution(int[][] scores) {
        StringBuilder builder = new StringBuilder();
        int row = scores.length;
        int column = row;
        boolean maxScore = true;
        boolean minScore = true;
        int[] selfScores = new int[row];
        float[] average = new float[column];
        
        // 1. 자신에게 부여한 점수를 구하기 selfScore O(N^2)
        // 2. self Score를 가지고 그 외 점수들과 비교 O(N^2)
        // 3. 제외 혹은 합산
        // 4. 평균
        // 5. 평균을 가지고 점수로 치환
        
        for(int i = 0; i < row; i++){
            for(int j = 0; j < row; j++){
                if(i == j) selfScores[i] = scores[i][j];
            }
        }
        
        
        for(int idx = 0; idx < row; idx++) {
            boolean max = false;
            boolean min = false;
            boolean equal = false;
            int selfScore = selfScores[idx];
            for(int secondIdx = 0; secondIdx < column; secondIdx++) {
                int temp = scores[secondIdx][idx];
                if(idx != secondIdx) {
                    if(selfScore > temp) max = true;
                    if(selfScore < temp) min = true;
                    if(selfScore == temp) equal = true;
                    average[idx] += temp;
                }
            }
            if(max == true && min == true || equal == true) {
                average[idx] += selfScore;
                average[idx] /= row;
            }else {
              average[idx] /= (row - 1);  
            }
        }
        
        for(int idx = 0; idx < row; idx++) {
            float score = average[idx];
            builder.append(score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 50 ? "D" : "F" );
        }
        
        return builder.toString();
        
    }
}

StringBuilder쓰니 연산속도가 역시 빠르다.