[Hackerrank] Grading Students 문제 해설 - Algorithms > Implementation / Easy

Grading Students

1. 문제 설명

이번 문제는 HackerLand University의 성적 판별 기준을 제시하고 입력된 학생들의 최종 grade를 산출하는 문제다.

HackerLand University의 기준은 다음과 같다.
  • 모든 학생은 0 ~ 100점 사이의 grade를 부여 받는다.
  • 40점보다 낮은 점수는 fail 처리 한다.
교수인 Sam의 기준은 다음과 같다.
  • 해당 학생의 grade와 다음 5의 배수인 값의 차가 3점 이하면 해당 grade를 해당 값으로 올려준다.
  • 점수가 38점보다 낮을 경우 반올림 하지 않는다.
예를 들어, grade = 84라면 점수를 상향 조정 해 최종 결과는 85가 된다. 
하지만 grade = 29라면 40점보다 낮은 점수이므로 반올림 하지 않으며, 최종 결과는 29가 된다.

2. Input Format

첫번째 줄에는 Sam의 수업에 참여하는 학생의 수(n)가 주어진다.
이후 i번째 줄에는 각 학생의 점수가 주어진다.


3. Output Format

i번째 줄에 반올림 처리가 된  gradei가 표시된다.

Sample Input

4
73
67
38
33

Sample Output

75
67
40
33



Solution

이 문제의 제약 사항은 2가지다. 
  1. 다음 5의 배수인 값과의 차이가 3보다 작을 경우 해당 값으로 반올림 해준다.
  2. 40점 미만인 학생은 반올림 하지 않고 기존 점수를 유지한다.
일단, 반올림 최소 점수인 38점을 기준으로 한 번 점수를 검증한다.
이후에 5의 배수 값으로 반올림 할 것인지 판단하다. 이 때 판단 기준은 5 - (점수 % 5) < 3이 된다. 학생의 점수를 5로 나누면 5다음 5의 배수와의 차이를 알 수 있다.

ex1. grade = 37
5 - (37 % 5 ) = 3 //5의 배수와의 차이는 3이지만, 최소 점수인 38점보다 낮기 때문에 결과값은 37이 됨

ex2. grade = 44
5 - (44 % 5) = 1 //반올림 해서 결과값은 45가 됨


ex3. grade = 41
5 - (41 % 5) = 4 //기준값인 3보다 크므로 결과값은 41이 됨

최종 코드는 다음과 같다.

const MIN_GRADE = 38;
const MIN_DIFF = 3;

function solve(grades){
  return grades.map((grade) => {
    let result = grade;
    const plus = 5 - (grade % 5);
    
    if (grade < MIN_GRADE) {
      return result;
    }

    if (plus < MIN_DIFF) {
      result = grade + plus;
    }

    return result;
  });
}

function main() {
    var n = parseInt(readLine());
    var grades = [];
    for(var grades_i = 0; grades_i < n; grades_i++){
       grades[grades_i] = parseInt(readLine());
    }
    var result = solve(grades);
    console.log(result.join("\n"));
}

댓글

이 블로그의 인기 게시물

[IIS] IIS 7.5 HTTP 오류 401.3 - Unauthorized 해결방법

[IIS] OraOLEDB.Oracle.1 설치 방법

[ASP] Server.CreateObject를 호출하지 못했습니다. 이 개체에 액세스할 수 없습니다.