[Programmers](Weekly Challenge)第2週-JAVA


📄 問題の説明


大学教授であるあなたは、相互評価を通じて学生たちに提出した宿題に加点したいと思っています.以下は、0~4番の5人の学生が自分と他の学生の宿題に対する採点表です.
No.01234009098886515045998577788958073615710080654249047565平均45.581.2597.281.667.8単位FBABD
上記の点数表では、i行j列の値は、i番学生が評価したj番学生の宿題点数である.
  • 0番生徒評価の点数は0番行中の[100,90,98,88,65]である.
  • 0番は100点、1番は90点、2番は98点、3番は88点、4番は65点.
  • 2番生徒評価の点数は2行目である[47,88,95,80,67].
  • 2番は0番が47点、1番が88点、自分が95点、3番が80点、4番が67点.
  • 学生ごとに得られる点数の平均値を求め、基準に従って単位を与えたいと思っています.
    学生が自分の点数が唯一の最高点または唯一の最低点であると評価した場合、それ以外は平均値を求める.
  • 0番生徒が獲得した点数は0番列の[100,50,47,61,24]である.自己評価の100点は自分が獲得した点数の中で唯一の最高点であり、平均を求める場合を除く.
  • 0番生徒の平均点は(50+47+61+24)/4=45.5.
  • 4番生徒が獲得した点数は4番列の[65,77,67,65,65]であった.自分の65点を評価するのは自分が得た点数の中で最低点だが、同じ点数はまだ2つあり、唯一の最低点ではない.したがって、平均値を求める場合は除外されません.
  • 4番生徒の平均点は(65+77+67+65+65)/5=67.8.
  • 除外する点数を除いて、平均点数を求め、以下の基準で単位を与えます.
    平均単位90点以上A 80点以上90点未満B 70点以上80点未満C 50点以上70点未満D 50点F
    学生スコアを含む整数型2 D配列スコアをパラメータとします.このとき、解関数を完了し、学生の単位を求めて文字列にして返してください.

    📑 せいげんじょうけん

  • 2≦点数の行の長さ(生徒数)≦10
  • 分数の列長=分数の行長
  • つまり、分数は行と列の長さが等しい2次元配列である.
  • 0≦分数の元素≦100
  • 戻り値フォーマット
  • 0番学生の単位から順に接続された文字列を返します.
  • 👨🏻‍💻 私が書いたコード

    import java.util.*;
    class Solution {
        public String solution(int[][] scores) {
           	  String answer = "";
    		  int average = 0;
    		 
    		  for(int i = 0; i < scores.length; i++) {
    			  ArrayList<Integer> list = new ArrayList<>();
    			  average = 0; // 평균값
    			  int min = 101; // 최소값 
    			  int max = 0; // 최대값
    			  boolean checkMax = false; // 중복x
    			  boolean checkMin = false; // 중복x
    			  for(int j = 0; j < scores.length; j++) {
    				  list.add(scores[j][i]);
    				  if(scores[j][i] > max) { //최대값이 바뀌면 중복값이 없다는 뜻.
    					  max = scores[j][i];
    					  checkMax = false; // 그래서 중복값은 false로 초기화.
    				  }else if(scores[j][i] == max) { // 최대값이랑 같다면 중복이 있다는 뜻.
    					  checkMax = true; // 중복이 있음.
    				  }
    				  if(scores[j][i] < min) {
    					  min = scores[j][i];
    					  checkMin = false;
    				  }else if(scores[j][i] == min) {
    					  checkMin = true;
    				  }
    			  }
                   		  //내가 나한테 준 점수가 최대값(최소값)이랑 같고 중복이 없다면
    			  if(list.get(i) == max && checkMax == false) {	
    				  list.remove(i); // 내 점수를 삭제해 준다.
    			  }else if(list.get(i) == min && checkMin == false) {	 
    				  list.remove(i);
    			  }
    			  for(int k = 0; k < list.size(); k++) { // 내가 받은 점수 합구하기 위한 for문
    				  average += list.get(k);	  
    			  }
    			  average /= list.size(); // 평균을 구해줌.
    			  if(average >= 90) {
    				  answer += "A";
    			  }else if(average >= 80) {
    				  answer += "B";
    			  }else if(average >= 70) {
    				  answer += "C";
    			  }else if(average >= 50) {
    				  answer += "D";
    			  }else{
    				  answer += "F";
    			  }
    		  }
    		  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();
        }
    }
    

    💡 に感銘を与える


    リストの集合とMath.maxとminでカッコ良く解きたいけど…思うようにいかないから...?解いてみました...これも1日かかりました.難しい問題...ううう