본문 바로가기
Algorithm/HackerRank

[HackerRank]Grading Students(풀이 성공)

by 전봇대파괴자 2021. 2. 24.

문제

 

HackerLand 대학은 다음과 같은 성적 산출 기준을 가지고 있다.

 

  • 모든 학생들은 0~100점까지의 범위 내 성적을 받는다.
  • 40점 이하의 성적을 받은 학생들은 낙제이다.

또한 이 대학의 교수인 Sam은 다음의 룰을 따라 학생들의 점수를 올림한다.

 

  • 만약 학생의 점수와 가장 가까운 5의 배수(단, 5의 배수 > 학생의 점수)의 차이가 3보다 작을 경우, 가장 가까운 5의 배수로 올림한다. 그렇지 않을 경우 점수는 그대로 둔다.
  • 만약 학생의 점수가 38보다 작다면, 올림하지 않고 낙제처리한다.    

위의 규칙에 맞추어 학생들의 점수를 산출하는 함수를 만들어라. Input으로는 학생 수 n, 각 학생들의 점수를 담은 배열 grade가 주어진다.(단, 1 ≤ n ≤ 60, 0 ≤ grade[i] ≤ 100)

 

Sample Input :

4 # 학생 수
73 # 이하 학생들의 점수
67
38
33

Sample Output :

75
67
40
33

 

내 코드:

import math
import os
import random
import re
import sys

def gradingStudents(grades):

    answer = [] 
    
    for i in range(grades_count):
        if grades[i] <= 37: # 1. 점수가 38보다 작을 경우
            answer.append(grades[i])
            
        else: 
            remainder = grades[i] % 5
            
            if remainder >= 3: # 2. 다음 5의 배수와의 차이가 3보다 작을 경우 
                answer.append(grades[i]+(5-remainder))
                
            else: # 3. 다음 5의 배수와의 차이가 3 이상일 경우
                answer.append(grades[i])
                
    return answer
 
 
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()

 

Comment:  중요한 포인트는 두 가지입니다.

 

1. 기준에 따라 성적을 산출하는 경우를 나누는 것(if~else문 사용)

2. 학생들의 점수와 5의 배수와의 차이를 확인하고 수정하는 것(학생들의 점수를 5로 나눈 나머지 사용) 

 

2번의 경우 직접적인 예시로 설명하는 편이 좋을 것 같습니다. sample input 중 하나인 67을 예로 들어보죠. 

 

67보다 크면서 가장 가까운 5의 배수는 70입니다.

두 수의 차이는 3이므로 올림의 조건에 해당하지 않죠. 따라서 67은 그대로 67이 됩니다. 

 

하지만 이 과정을 코드로 옮길 때, 모든 점수보다 크면서 가장 가까운 5의 배수를 알아내고 다시 그걸 빼는 과정은 번거롭기만 합니다. 나머지를 활용하는 것이 훨씬 더 빠른 방법이죠. 

 

67%5
>> 2

 

이 나머지를 5에서 빼주면 정확히 70과의 차인 3이 나옵니다. 따라서 학생의 점수를 5로 나눈 나머지를 구해 5에서 빼주기만 하면 5의 배수와의 차를 구할 수 있고, 해당 점수를 올림할지 그대로 둘지 결정할 수 있습니다. 

 

다른 예를 하나 더 들어보죠.

 

73%5
>> 3

 

나머지 3을 5에서 빼주면 2가 나옵니다. 올림의 기준을 충족하므로 이 값을 더해주기만 하면 됩니다. 

따라서 나머지가 3보다 작을 경우(올림 기준 충족되지 않음)와 그렇지 않은 경우(올림 기준 충족)로 나눠주면 쉽게 함수를 만들 수 있습니다.