Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 대표값

yaebb_82 2023. 4. 7.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

문제

N명의 학생의 수학 점수가 주어집니다. N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세요.
(평균과 가장 가까운 점수가 여러개 → 먼저 점수가 높은 학생의 번호를 답으로 하고,)
(높은 점수를 가진 학생이 여러명 → 학생 번호가 빠른 학생의 번호를 답으로 합니다.)

 

 

 

풀이

from itertools import combinations
import sys
input = sys.stdin.readline

N = int(input())
math_grades = list(map(int, input().split()))
avg = round(sum(math_grades)/N + 0.5)
min = 1e9

for index, grades in enumerate(math_grades):
    diff = abs(grades - avg)
    if diff < min:
        min = diff
        score = grades
        res = index+1
    elif diff == min:
        if grades > score:
            score = grades
            res = index+1

print(avg, res)

[*핵심 : 최솟값 구하는 로직이 포함되어 있다]

 

- 문제를 보고 처음 생각한 방식과 답안의 방식이 거의 비슷했지만, 마지막 if문에서 조금 달랐다.

- grades(학생의 점수)가 score(현재 평균에 가까운 점수)보다 클 때만 고려해주면, 같은 점수 일 때는 알아서 걸러지게 된다는 것을 알게 되었다.

- grades가 score와 같게 되었을 때(같은 점수일 때), 학생 번호가 빠른 학생의 번호를 답으로 해야 한다. 하지만 어차피 앞번호서부터 차례대로 for문을 돌려 비교를 하고 있기 때문에 조건문을 다시 열어서 따로 확인해줄 필요가 없는 것이다.

- 처음에 문제를 풀 때 enumerate()를 생각하지 못해서 list()로 index와 grades를 처리하고 있었는데, enumerate()를 사용하니 코드가 더욱 간결해졌다.

- 학생의 점수와 평균 값의 차이를 비교하는 것이기 때문에 절댓값이 필요하여 abs()를 사용해주었다.

- 반올림을 할 때 round()를 써왔었는데, round()를 쓰게 되면 지정한 자리수 밑으로 다 버려지게 된다.

   ex) a = 74.5 일 때, round(a) == 74가 나오게 된다. → 이를 방지하기 위해서 0.5를 더해준다. → round(a+0.5) == 75

 

 

 

반응형

댓글