Juni_Dev_log

(인프런) 파이썬 알고리즘 문제1-4 "대표값" 본문

CodingTest/인프런 (Algorithm)

(인프런) 파이썬 알고리즘 문제1-4 "대표값"

Juni_K 2021. 2. 13. 15:10

Python

Problem

대표값 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번이 답이 됩니다.

 

 

💯 Solution ①

: Only My Thinking (어려워서 설명듣고 풀었음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 파일에서 값을 가져옴
import sys
# 채점을 할 때는 아래 코드 주석 처리
sys.stdin=open("input.txt""rt")
 
# n명의 학생 수
n=input()
# 학생들의 점수를 리스트형식으로 가져온다.
n_list=list(map(int,input().split()))
 
# 학생들의 평균 점수 / 소수 첫째 자리에서 반올림
average_score=round(sum(n_list)/len(n_list))
min=float('inf')
 
# 순서가 중요하기 때문에, sort()를 할 수 없음
for idx, x in enumerate(n_list):
    # 평균에서 해당값까지의 거리 : 절댓값 abs()사용
    tmp = abs(x-average_score)
    # 최솟값보다 tmp가 작다면
    if tmp<min:
        min=tmp
        # score에 해당 값을 넣는다.
        score=x
        # res는 해당 순서
        res=idx+1
    # tmp값과 최솟값이 같다면
    elif tmp==min:
        # score값보다 현재 값이 크다면
        if x>score:
            score=x
            res=idx+1
print(average_score, res)
cs

 

- 평균을 구하고, 최솟값으로 min을 설정한다. (float('inf'))

-  enumerate() 사용 

- abs() : 절댓값으로 평균과의 거리 구하기

- 평균값과 평균에서 가까운 값의 순서를 print한다.

 

 

💯 Solution ②

: Tutor advice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#Tip) 
 
# 파일에서 값을 가져옴
import sys
# 채점을 할 때는 아래 코드 주석 처리
sys.stdin=open("input.txt""rt")
 
# n명의 학생 수
n=int(input())
# 학생들의 점수를 리스트형식으로 가져온다.
a=list(map(int,input().split()))
# round():소수 첫째 짜리에서 반올림
ave=round(sum(a)/n)
# 최솟값으로 설정할 변수와 큰 값을 초기화값으로 입력한다.
min=float('inf')
 
# idx : 학생 번호 / enumerate(a) : idx에는 인덱스 값을 넣고, x에는 값을 넣는다.
for idx, x in enumerate(a):
    # 평균과 학생의 값과의 거리를 구해야함
    tmp=abs(x-ave)
    if tmp<min:
        min=tmp
        # 거리가 같을 떄는 큰 점수로 해야함
        score=x
        # 평균과 가장 가까운 점수의 학생의 인덱스 번호 => res
        # idx에 1을 더해야 인덱스번호
        res=idx+1
    # 이전 값(min)과 tmp가 같다면, x(현재값) > score(이전값)이라면, x를 score로 할당하고, idx번호를 변경한다.
    elif tmp==min:
        if x>score:
            score=x
            res=idx+1
 
print(ave, res)
cs

 

📚 참고

mong9data.tistory.com/33

 

[파이썬/Python] 리스트의 정렬 방법 - sort함수와 sorted함수

리스트의 정렬 프로그래밍 언어에서 리스트 혹은 배열을 정렬하는 알고리즘은 다양하다. 가장 간단한 선택 정렬, 버블 정렬부터 삽입 정렬, 쉘 정렬, 병합 정렬, 퀵 정렬 등의 효율성을 높인 알

mong9data.tistory.com

blog.naver.com/PostView.nhn?blogId=okkam76&logNo=221276394091&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search

 

[파이썬 수학] 절대값 표현 - abs( ) 함수

수학적으로 절대값은 |x|라고 나타낸다. 파이썬(Python)에서 절대값을 계산하는 방식은 아주 간단하다. 파...

blog.naver.com

playthegame00.tistory.com/69

 

[Python] 파이썬 자리수 (올림,반올림)

반올림 round(실수,n) 소수점을 n번째 까지만 표현하고 반올림을 하고싶을때, round 함수를 사용하면된다. >>> n =10/3 >>> n 0.3333333333333 >>> round(n,2) 0.33 >>> round(n,4) 0.3333 두번째매개변수를..

playthegame00.tistory.com

 

brownbears.tistory.com/118

 

[Python] Tip - range 보다는 enumerate를 사용

내장 함수 range는 정수 집합을 순회(iterate)하는 루프를 실행할 때 유용합니다. random_bits = 0 for i in range(64): if randint(0, 1): random_bits |= 1 << i 물론 문자열의 리스트 같이 순회할 자료 구조가..

brownbears.tistory.com

 

Comments