큰 어려움이 있는 문제는 아닌데 너무 비효율적으로 푼 느낌이다. 많이 안풀다 보니깐 있던 감마저 떨어진 느낌...
i번 학생을 평가한 점수들을 새로운 배열에 담아서, 자기자신을 평가한 점수와 함께 makeSum이라는 메서드에 넘겨준다.
makeSum에서는 우선 넘겨받은 배열을 오름차순으로 정렬한 후에, 자기 자신을 평가한 점수(self_score)와 비교하는데 이때 배열의 0번째 값과 같은경우에 self_score가 최저점이라는 소리인데 여기서 인덱스값과 비교해 값이 같을 경우 유일한 최저점이 아니므로 평균에 포함, 값이 다를경우 유일한 최저점이므로 평균에 포함하지 않는다.
같은 방법으로 최저점이 아닌경우에는 최고점일때 비교하며, 이 두가지 경우에 속하지 않는다면 최저점, 최고점이 아니므로 평균에 넣어서 계산한다.
마지막으로 평균이 어느 구간에 속하는지 파악하고 그것을 String으로 return해서 answer에 붙인다.
import java.util.*;
class Solution {
public String solution(int[][] scores) {
String answer = "";
for(int i=0; i<scores.length; i++){
int self_score = scores[i][i];
int [] scoreArray = new int[scores.length];
for(int j=0; j<scores.length; j++){
scoreArray[j] = scores[j][i];
}
double sum = makeSum(self_score, scoreArray);
// System.out.println(sum);
answer+=makeString(sum);
}
return answer;
}
public double makeSum(int self_score, int [] scores){
Arrays.sort(scores);
double res = 0;
int idx = 0;
if(self_score == scores[0]){
if(scores[0]==scores[1]){
//유일한 최저점이 아님
for(int i=0; i<scores.length; i++){
res += scores[i];
}
idx = scores.length;
}else{
//유일한 최저점인 경우
for(int i=0; i<scores.length; i++){
res += scores[i];
}
res -= self_score;
idx = scores.length-1;
}
}else if(self_score == scores[scores.length-1]){
if(scores[scores.length-1]==scores[scores.length-2]){
//유일한 최고점이 아님
for(int i=0; i<scores.length; i++){
res += scores[i];
}
idx = scores.length;
}else{
//유일한 최고점인 경우
for(int i=0; i<scores.length; i++){
res += scores[i];
}
res -= self_score;
idx = scores.length-1;
}
}else{
//최고점, 최저점이 아닌 경우
for(int i=0; i<scores.length; i++){
res += scores[i];
}
idx = scores.length;
}
return res/idx;
}
public String makeString(double sum){
String res = "";
if(sum>=90){
return "A";
}else if(sum>=80 && sum<90){
return "B";
}else if(sum>=70 && sum<80){
return "C";
}else if(sum>=50 && sum<70){
return "D";
}else{
return "F";
}
}
}