문제
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보다 작을 경우(올림 기준 충족되지 않음)와 그렇지 않은 경우(올림 기준 충족)로 나눠주면 쉽게 함수를 만들 수 있습니다.
'Algorithm > HackerRank' 카테고리의 다른 글
[HackerRank]Permuting Two Arrays (0) | 2021.03.02 |
---|---|
[HackerRank]Time Conversion(풀이 성공) (0) | 2021.02.09 |
[HackerRank]Birthday Cake Candles(풀이 성공) (0) | 2021.02.01 |
[HackerRank]Diagonal Difference(풀이 성공) (0) | 2021.01.28 |
[HackerRank]Compare the Triplets(풀이 성공) (0) | 2021.01.16 |