2024. 6. 11. 21:15ㆍ개발의 흔적/코딩테스트
문제: 대표값
N명의 학생의 수학점수가 주어집니다. N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세 요.
평균과 가장 가까운 점수가 여러 개일 경우 먼저 점수가 높은 학생의 번호를 답으로 하고, 높은 점수를 가진 학생이 여러 명일 경우 그 중 학생번호가 빠른 학생의 번호를 답으로 합니다.
<입력설명>
첫줄에 자연수 N(5<=N<=100)이 주어지고, 두 번째 줄에는 각 학생의 수학점수인 N개의 자연 수가 주어집니다. 학생의 번호는 앞에서부터 1로 시작해서 N까지이다.
<출력설명>
첫줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다. 평균은 소수 첫째 자리에서 반올림합니다.
10
45 73 66 87 92 67 75 79 75 80
출력예제74 7
예제설명)
평균이 74점으로 평균과 가장 가까운 점수는 73(2번), 75(7번), 75(9번)입니다. 여기서 점수가 높은 75(7번), 75(9번)이 답이 될 수 있고, 75점이 두명이므로 학생번호가 빠른 7번이 답이 됩니다.
1. 평균구하기
2. 각 점수의 평균과의 편차 구하고, 편차의 절대값이 작은값 갱신
- 편차의 절대값이 같다면, 음양을 따진다
import sys
from sys import maxsize
import math
input = sys.stdin.readline
N = int(input())
score_list = list(map(int, input().split()))
avg = round(sum(score_list)/N)
# avg = int(avg) if -0.5<= avg-int(avg) < 0.5 else int(avg)+1
min_gap_index = 0
min_gap = maxsize
for i, score in enumerate(score_list):
gap = score - avg
if abs(gap) < abs(min_gap):
min_gap = gap
min_gap_index = i
if abs(gap) == abs(min_gap):
if gap > min_gap:
min_gap = gap
min_gap_index = i
print(avg, min_gap_index+1)
갱신시 따져야 할 것
1. 현재_편차의_절댓값 vs 기존_갱신값의_절댓값
현재 편차가 작을때 : 무조건 현재것 갱신
같을 때: 기존_갱신값이 양수일때 -> pass 기존_갱신값이 음수일때 -> 현재-편차가 양수면 갱신
round()함수를 몰라서
avg = int(avg) if -0.5<= avg-int(avg) < 0.5 else int(avg)+1
를 사용했는데, 외우자!!
'개발의 흔적 > 코딩테스트' 카테고리의 다른 글
| [구현] (2-7) 소수찾는 가장 작은 시간복잡도 : 에라토스테네스의 체 (1) | 2024.06.12 |
|---|---|
| [구현] (2-5) 정다면체 주사위 (2) | 2024.06.11 |
| [구현] (2-3) combinations의 시간복잡도 (0) | 2024.06.11 |
| [구현] (2-2) 자료구조의 원하는 구간만 sorting하기 (0) | 2024.06.11 |
| [구현] (2-1) 약수 구할때에 시간복잡도 줄이기 (1) | 2024.06.11 |