준호씨의 블로그

hackerrank - Grading Students - Python3 본문

개발이야기/PS - Problem Solving, 알고리즘

hackerrank - Grading Students - Python3

준호씨 2020. 5. 6. 00:05
반응형

문제: https://www.hackerrank.com/challenges/grading/problem

HackerLand 대학은 다음과 같은 성적 정책이 있습니다.
* 모든 학생은 0~100의 성적을 받습니다.
* 어떤 성적이든 40점 미만이면 낙제점입니다.

Sam은 HackerLand대학의 교수입니다. 다음 규칙에 따라 각 학생의 성적(grade)을 올림 합니다.
* 성적이 성적보다 큰 5의 배수 값과의 차이가 3보다 작은 경우 5의 배수 값으로 올림 합니다.
* 성적이 38보다 작으면 결과가 여전히 실패한 성적이므로 올림을 하지 않습니다.
예를 들어, grade = 84는 85로 올림 됩니다. 그러나 grade = 29는 올림 되지 않습니다. 올림해도 40보다 작기 때문입니다.
Sam의 n명의 학생들의 각각의 등급 값이 주어지면 반올림 프로세스를 자동화하는 코드를 작성하시오.

Sample Input 0

4
73
67
38
33

Sample Output 0

75
67
40
33

학생 1은 73점을 받았습니다. 73보다 큰 5의 배수는 75입니다. 차이가 2로 3보다 작기 때문에 75점으로 올림 합니다.
학생 2는 67을 받았습니다. 70과는 3 차이가 나기 때문에 올림 하지 않습니다.
학생 3은 38점을 받았습니다. 40과 2 차이가 나기 때문에 올림 해서 40점이 됩니다.
학생 4는 33점을 받았습니다. 38점보다 작기 때문에 올림 하지 않아서 최종 점수가 33점이 됩니다.

 

풀이

이번 문제는 문제 해석에서 좀 고생했습니다. 해석하고 남녀 문제 자체는 별로 어렵진 않습니다.

코드 템플릿

#!/bin/python3

import math
import os
import random
import re
import sys

#
# Complete the 'gradingStudents' function below.
#
# The function is expected to return an INTEGER_ARRAY.
# The function accepts INTEGER_ARRAY grades as parameter.
#

def gradingStudents(grades):
    # Write your code here

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    grades_count = int(input().strip())

    grades = []

    for _ in range(grades_count):
        grades_item = int(input().strip())
        grades.append(grades_item)

    result = gradingStudents(grades)

    fptr.write('\n'.join(map(str, result)))
    fptr.write('\n')

    fptr.close()

gradingStudents함수를 완성합니다. 여러 줄로 출력하는 문제이지만 리스트를 받으면 여러 줄로 출력하도록 코드가 구현되어 있기 때문에 gradingStudents함수의 반환 값은 리스트로 반환하면 됩니다.

grade가 38점 미만이거나 올림 대상이 아니면 점수를 그대로 사용합니다. 즉, 점수가 38점 이상이거나 올림 대상이면 5의 배수 값이 맞게 올림 처리하면 됩니다.

올림 대상인지는 어떻게 확인하면 될까요? 0~4점을 기준으로 0,1,2점은 올림 대상이 아니고 3,4점은 올림 대상입니다. 점수를 5로 나눈 나머지 값이 3 이상 이면 올림 대상이라고 보면 됩니다.

올림 처리는 어떻게 하면 될까요? 방법은 여러 가지가 있을 건데요. 무식하게 해 보면 1씩 더하다가 5로 나누어 떨어지면 그 값을 사용하면 됩니다. 코드를 좀 더 줄이려면 5에 나머지 값을 뺀 값을 점수에 더해 주면 됩니다. 점수에 5를 더한 다음 기존 점수에 5로 나누고 남은 나머지 값을 빼도 됩니다.

38점이 점수이면 5로 나눈 나머지는 3입니다. 5-3=2입니다. 38에 2를 더하면 40이 됩니다.

위에서 설명한 것처럼 gradingStudents함수를 만들어 보면 다음과 같습니다.

def gradingStudents(grades):
    ans = []
    for grade in grades:
        if grade >= 38 and grade % 5 >= 3:
            ans.append(grade + (5 - grade % 5))
        else:
            ans.append(grade)
    return ans

 

반응형
Comments