본문 바로가기
알고리즘

[프로그래머스/JAVA] 상호 평가

by 상후 2021. 9. 11.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 2주차_상호평가

[[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]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

문제 설명

출처 : 프로그래머스

정리하면,  스스로에게 준 점수가 유일한 최대/최소값이면 점수에서 제외시킵니다.
그리고 학생들의 점수의 평균을 구한 뒤 그에 맞는 등급을 반환하면됩니다. 
풀이 방법
각 스텝별 메서드를 구현하였습니다.
 
1. 각 학생이 받은 전체 점수들을 map을 통해 저장합니다. (key : 학생, value : 해당학생이 받은 점수)
2. 나에게 준 점수가 유일한 최고/최저점 이라면 해당 점수를 제거합니다.
3. 점수 목록을 가지고 평균값을 구한 뒤 점수에 해당하는 등급을 구합니다.
내 코드(JAVA)

 

public class Solution {

    // 학생별 점수를 담기위한 Map
    Map<Integer, List<Integer>> scoreMap = new HashMap<>(); 

    public String solution(int[][] scores) {
        StringBuilder answer = new StringBuilder();

        // 1. 각 학생이 받은 전체 점수들을 map을 통해 저장합니다. (key : 학생, value : 해당학생이 받은 점수)
        setBasicScore(scores);

        for(int i=0; i < scores.length; i++) {
            List<Integer> scoreList = scoreMap.get(i);
            int selfScore = scoreList.get(i);

            // 2. 스스로에게 준 점수가 유일한 최고/최저점인지 확인한 후 true 라면 해당 점수를 제거합니다.
            if(isRemoveMyScore(scoreList, selfScore)) scoreList.remove(i);
            // 3. 점수 목록을 가지고 평균값을 구한 뒤 점수에 해당하는 등급을 구합니다.
            answer.append(getGrade(scoreList));
        }

        return answer.toString();
    }

    /**
     * 학생별로 점수를 map에 저장하는 메서드(key : 학생명(숫자), value : 자신의 점수 list)
     */
    public void setBasicScore(int[][] scores) {
        for(int i=0; i<scores.length; i++) {
            List<Integer> score = new ArrayList<>();
            for(int j=0; j<scores[i].length; j++) {
                score.add(scores[j][i]);
            }
            scoreMap.put(i, score);
        }
    }

    /**
     * 자신에게 준 점수가 유일한 최고점 또는 최저점인지 반환하는 메서드
     */
    public boolean isRemoveMyScore(List<Integer> scoreList, int selfScore) {
        int count = 0;
        int min = Collections.min(scoreList);
        int max = Collections.max(scoreList);

        if(selfScore == min || selfScore == max) {
            for(int score : scoreList) {
                if(score == selfScore) count++;
            }
        }

        return (count == 1) ? true : false;
    }

    /**
     * 점수들의 평균을 구한 뒤 평균에 해당하는 등급을 반환하는 메서드
     */
    public String getGrade(List<Integer> scoreList) {
        String grade = "";
        double sum = 0;
        double avg = 0.0;

        for(int score : scoreList) {
            sum += score;
        }
        avg = sum/scoreList.size();

        if(avg >= 90) grade = "A";
        else if(avg >= 80 && avg < 90) grade = "B";
        else if(avg >= 70 && avg < 80) grade = "C";
        else if(avg >= 50 && avg < 70) grade = "D";
        else grade = "F";

        return grade;
    }
}

 

넘 복잡하게 느껴지는 것 같기도 하네요... 😢

 

 

 

 

728x90
반응형

댓글