본문 바로가기

PROGRAMMING/ALGORITHM

[프로그래머스] 위클리 챌린지 2주차

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

 

어떻게든 for문 2번 안 써보려 했지만 포기하고.. 최대한 명확하게 풀려고 노력했다.

 

문제 요약 

학생이 학생에게 (본인포함) 점수를 주는데 그에 대한 평균값을 구하고 이를 학점으로 환산하는 문제이다.

 

풀이 방법

문제요약만 보면 매우 간단해 보이지만,

역시 예외사항이 항상 문제다.

내가 나한테 준 점수가 최고점이거나 최저점이면서 + 다른 사람과중복되지 않는경우

총합계에서 제외한다.

일단 min max값을 구해야 하며, 이 구한 값들이 배열 내에서 중복되는지도 확인해야 된다.

최대한 코드를 읽기 쉽게 구현하려고 변수명이나 함수를 따로 구성해서 짰다.

 

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String solution(int[][] scores) {
        StringBuilder answer = new StringBuilder();
        int[] avgScore = new int[scores.length];

        for(int i= 0; i<scores.length; i++) {
            int max = -1;
            int min = 101;
            int selfScore = 0;
            int[] myScore = new int[scores.length];
            for (int j = 0; j < scores.length; j++) {
                if(i==j)    selfScore = scores[j][i];
                max = scores[j][i] > max ? scores[j][i] : max;
                min = scores[j][i] < min ? scores[j][i] : min;
                myScore[j] = scores[j][i];
                avgScore[i] += scores[j][i];
            }

            boolean isCalculate = false;
            //내가 나한테 준 점수가 최고점 혹은 최저점일때
            if(selfScore == max || selfScore == min){
                    //나와 중복되게 점수가 있는지 체크한다
                if(!isDuplicate(myScore, selfScore)){
                    avgScore[i] -= selfScore;
                    avgScore[i] = avgScore[i]/(avgScore.length-1);
                    isCalculate = true;
                }
            }
            if(!isCalculate){
                avgScore[i] = avgScore[i]/avgScore.length;
            }
            answer.append(scoring(avgScore[i]));
        }

        return answer.toString();
    }
    public String scoring(int score){
        if(score >= 90)  return "A";
        else if(score >= 80) return "B";
        else if(score >= 70) return "C";
        else if(score >= 50) return "D";
        else return "F";
    }

    public boolean isDuplicate(int[] arr, int target){
        int cnt = 0;
        for(int temp : arr){
            if(target == temp) cnt++;
            if(cnt > 1) return true;
        }
        return false;
    }
}

 

항상 그렇지만, 문제를 한 번에 채점 통과를 할 때면 그 어디서도 느끼지 못할 희열이 느껴진다.

그러니까 이 일을 계속하는 것 같기도 하고 ㅎㅎ

 

여하튼 퇴근하고 푼 보람이 있었다 재밌었다