Learn & Run

[Programmers] 상호 평가 (Java, Kotlin) 본문

Algorithm/Programmers

[Programmers] 상호 평가 (Java, Kotlin)

iron9462 2021. 8. 11. 20:31

https://programmers.co.kr/learn/courses/30/lessons/83201?language=kotlin 

 

코딩테스트 연습 - 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

 

문제

i x j 배열이 입력값으로 들어올 때 scores[i][j]의 값은 i행이 j열을 평가한 점수를 나타내는 것이다. 이 때, 각자가 받은 점수에 대해서 본인이 평가한 점수가 받은 점수중 유일한 최고점, 최저점이라면, 평균 점수를 계산할 때 제외시키면 된다. 여기서 평균 점수란 본인이 받은 점수들의 평균 점수를 말한다.

 

접근 아이디어

1. 본인이 받은 점수들의 합을 나타내는 배열, 본인을 평가한 점수를 나타내는 배열을 만든다.

2. 본인이 받은 점수들 중에서 자기자신을 평가한 점수가 유일한 최고점인지 최저점인지 체크를 해준다.

3. 유일한 최고점이나 최저점이 맞다면, 본인을 평가한 점수를 나타내는 배열에서 값을 빼준후 평균 점수를 구한다.

4. 계산된 평균 점수를 문제에서 제시된 알파벳으로 변환하요 결과 값을 구성한다.

 

조심해야할 점

평균 점수를 계산할 때, i x j 배열에서 본인이 평가 받은 점수가 어디를 나타내는지 잘 알아야한다.

 

- Java

class Solution {
    
    public String solution(int[][] scores) {
        
        StringBuilder answer = new StringBuilder();
        int size = scores.length;

        double[] sum = new double[size];
        double[] arr = new double[size];

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                sum[j] += scores[i][j];
                if (i == j) arr[i] = scores[i][j];
            }
        }

        for (int i = 0; i < size; i++) {
            double temp = 0.0d;
            int count = size - 1;
            for (int j = 0; j < size; j++) {
                temp += scores[j][i];
                if ((scores[j][i] < arr[i]) && i != j) count--;
            }

            if (count == 0) {
                arr[i] = (temp - arr[i]) / (size - 1);
                continue;
            }

            count = size - 1;

            for (int j = 0; j < size; j++) {
                if ((scores[j][i] > arr[i]) && i != j) count--;
            }

            if (count == 0) {
                arr[i] = (temp - arr[i]) / (size - 1);
            } else {
                arr[i] = temp / size;
            }
        }

        for(int i=0; i<size; i++) {
            answer.append(setCharGrade(arr[i]));
        }

        return answer.toString();
    }

    private char setCharGrade(double grade) {
        if (grade >= 90.0) {
            return 'A';
        } else if (grade >= 80.0) {
            return 'B';
        } else if (grade >= 70.0) {
            return 'C';
        } else if (grade >= 50.0) {
            return 'D';
        } else {
            return 'F';
        }
    }
}

 

 

- Kotlin

class Solution {
    
    fun solution(scores: Array<IntArray>): String {
        val size = scores.size
        val sum = DoubleArray(size) { 0.0 }
        val arr = DoubleArray(size) { 0.0 }

        for (i in scores.indices) {
            for (j in scores[i].indices) {
                sum[j] += scores[i][j].toDouble()
                if (i == j) {
                    arr[i] = scores[j][i].toDouble()
                }
            }
        }

        for (i in scores.indices) {
            var temp = 0.0
            var count = size - 1
            for (j in scores.indices) {
                val score = scores[j][i]
                temp += score

                if((arr[i] > score) && i != j) {
                    count--
                }
            }

            if(count == 0) {
                arr[i] = (temp - arr[i]) / (size - 1)
                continue
            }

            count = size - 1
            
            for (j in scores.indices) {
                val score = scores[j][i]
                if(arr[i] < score && i != j) {
                    count--
                }
            }

            if(count == 0) {
                arr[i] = (temp - arr[i]) / (size - 1)
            } else {
                arr[i] = temp / (size.toDouble())
            }
        }

        return arr.map { getCharScore(it) }.joinToString(separator = "")
    }

    fun getCharScore(num: Double): Char {
        return when {
            num >= 90 -> 'A'
            num >= 80 -> 'B'
            num >= 70 -> 'C'
            num >= 50 -> 'D'
            else -> 'F'
        }
    }
}

 

 

좌(Java 채점 결과), 우(Kotlin 채점 결과)