문제를 설명하거나 사진으로 찍어 올리기에도 내용이 너무 방대하여 링크로 대신한다.
public class W2 {
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}};
W2 w = new W2();
String solution = w.solution(scores);
System.out.println("solution = " + solution);
}
public String solution(int[][] scores) {
StringBuilder answer = new StringBuilder();
int size = scores.length;
double[] arr = new double[size];
for(int i=0; i<size; i++){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int self = -1;
int sum = 0;
int person = size;
Queue<Integer> list = new LinkedList<>();
for(int j=0; j<size; j++){
int su = scores[j][i];
if(i==j) self = su;
max = Math.max(max, su);
min = Math.min(min, su);
sum += su;
list.add(su);
}
list.remove(self);
if(max == self || min == self){
if(!list.contains(self)){
person--;
sum -= self;
}
}
arr[i] = (double)sum/(double)person;
}
for(double i : arr){
if(i>=90) answer.append("A");
else if(90>i&&i>=80) answer.append("B");
else if(80>i&&i>=70) answer.append("C");
else if(70>i&&i>=50) answer.append("D");
else answer.append("F");
}
return answer.toString();
}
}
문제를 보자마자 2차원 배열을 사용하여 문제를 풀어내야겠다 생각이 들었다. 여기서 가장 큰 문제는
이정도인거 같다. 문제를 읽을때 3번을 읽어내지 못해서 처음에 테스트 케이스는 통과하는데 제출했을 때 여러 문제가 실패로 나와서 당황했다. 그래서 질문하기를 들어가서 다른 사람의 질문 내용을 봤더니 누군가가 답변으로 예시 배열의 마지막 학생의 예시를 잘 봐보라는 거였다.
뭐 딱히 특별한건 없고 queue의 remove를 사용하여 자신에게 준 점수가 최소, 최대값일 경우 다른 사람도 자신에게 그 점수를 줬는지 확인하는 정도 로직이 있을 것 같다. queue는 list와 다르게 object를 통해 값을 제거할 수 있는데 이 특징을 사용하여 remove를 한 뒤 self 값이 list에 있는지 확인해보는 로직을 넣었다.
그리고 마지막에 배열에 담긴 값들을 하나씩 꺼내어 학점을 부여하는데 더 빠르게 하려면 꺼내지 않고 위 반복문에서 배열에 값을 넣는 코드 대신 answer에 append하면 더 빠를거 같다.
아직까진 큰 문제 없이 풀고 있는데 언제 막히려나... 기분 전환하면서 풀기엔 좋은데 그래도 강의를 들으러 다시 가야겠다...!