상호 평가 (프로그래머스 weekly challange 2)

최준호·2021년 10월 6일
0

알고리즘 강의

목록 보기
69/79

문제

문제 바로가기

문제를 설명하거나 사진으로 찍어 올리기에도 내용이 너무 방대하여 링크로 대신한다.

코드

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차원 배열을 사용하여 문제를 풀어내야겠다 생각이 들었다. 여기서 가장 큰 문제는

  1. 배열이 [i][j]의 순서가 아닌 [j][i]의 순서로 나열해야함
  2. 배열에서 자기가 체크한 점수가 가장 크거나 작은 점수인지 확인
  3. 그 점수가 자신 외 다른 사람도 나에게 준 점수라면 체크하지 않음

이정도인거 같다. 문제를 읽을때 3번을 읽어내지 못해서 처음에 테스트 케이스는 통과하는데 제출했을 때 여러 문제가 실패로 나와서 당황했다. 그래서 질문하기를 들어가서 다른 사람의 질문 내용을 봤더니 누군가가 답변으로 예시 배열의 마지막 학생의 예시를 잘 봐보라는 거였다.

뭐 딱히 특별한건 없고 queue의 remove를 사용하여 자신에게 준 점수가 최소, 최대값일 경우 다른 사람도 자신에게 그 점수를 줬는지 확인하는 정도 로직이 있을 것 같다. queue는 list와 다르게 object를 통해 값을 제거할 수 있는데 이 특징을 사용하여 remove를 한 뒤 self 값이 list에 있는지 확인해보는 로직을 넣었다.

그리고 마지막에 배열에 담긴 값들을 하나씩 꺼내어 학점을 부여하는데 더 빠르게 하려면 꺼내지 않고 위 반복문에서 배열에 값을 넣는 코드 대신 answer에 append하면 더 빠를거 같다.

아직까진 큰 문제 없이 풀고 있는데 언제 막히려나... 기분 전환하면서 풀기엔 좋은데 그래도 강의를 들으러 다시 가야겠다...!

0개의 댓글

관련 채용 정보