상호 평가 (프로그래머스 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하면 더 빠를거 같다.

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

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글