본문 바로가기
코딩테스트 연습

채점하기.. 본인이 채점한 점수가 최고값,최소값일 경우는 제외하고

by 고유빙글 2021. 8. 20.

학생들끼리 서로 채점하여, 본인의 점수가 유일한 최고점이거나, 최소점일 경우에는 본인이 채점한 본인의 점수를 제외하고 평균을 내어. 그 값으로 평점을 매기는 코드

 

public class pointingTest {

	public static void main(String[] args) {
		
		int[][] scores = {{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}};
		String answer = solution(scores);
		System.out.println(answer);
		
	}

	private static String solution(int[][] scores) {
		int[][] a = scores;
		int[][] b = new int[scores.length][scores.length];
		int[] sum = new int [b.length];
		int[] aver = new int [b.length];
		int[] check = new int [b.length];
		String answer = "";
		
		for (int i = 0; i < scores.length; i++) {
			for (int j = 0; j < scores[i].length; j++) {
				b[j][i] = a[i][j];
			}
		}
		
//		System.out.print("{");
//		for (int i = 0; i < scores.length; i++) {
//			System.out.print("{");
//			for (int j = 0; j < scores.length; j++) {
//				System.out.print(b[i][j]);
//				if(j!=scores.length-1) {
//					System.out.print(",");
//				}
//			}
//			System.out.println("}");
//		}
//		System.out.println("}");
		
		
		for (int i = 0; i < b.length; i++) {
			for (int j = 0; j < b.length; j++) {

				if(b[i][i]>b[i][j] && i!=j) {
					check[i]++;
				}else if(b[i][i]<b[i][j] && i!=j) {
					check[i]--;
				}
				
			}
		}
		
//		System.out.print("{");
//		for (int i = 0; i < check.length; i++) {
//			System.out.print(check[i]);
//			if(i!=check.length-1) {
//				System.out.print(",");
//			}
//		}
//		System.out.println("}");
		
		for (int i = 0; i < check.length; i++) {
			for (int j = 0; j < check.length; j++) {
				
				if(check[i]==scores.length-1 || check[i]==-(scores.length-1)) {
					sum[i] += (j!=i)? b[i][j]:0;
					aver[i] = sum[i]/(sum.length-1);
				}else {
					sum[i] += b[i][j];
					aver[i] = sum[i]/(sum.length);
				}
			}
		}
		
//		System.out.print("{");
//		for (int i = 0; i < sum.length; i++) {
//			System.out.print(sum[i]);
//			if(i!=check.length-1) {
//				System.out.print(",");
//			}
//		}
//		System.out.println("}");
		
		
		for (int i = 0; i < aver.length; i++) {
			if(aver[i]>=90) {
				answer += "A";
			}else if(aver[i]>=80) {
				answer += "B";
			}else if(aver[i]>=70) {
				answer += "C";
			}else if(aver[i]>=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();
    }
}