Algorithm/파이썬 알고리즘 문제풀이 강의

[코드 구현력 기르기] 4. 대표값

이숨인 2023. 3. 8. 17:58

0. 선수지식

최솟값 구하기

arr = [5,3,7,9,2,5,2,6]
// 가장 작은 값이 기록되는 변수 : arrMin
arrMin=float('inf') #파이썬에서 가장 큰 값으로 변수 초기화
for i in range(len(arr)) #0부터 7까지 탐색 # for i in arr 으로 해도 됨
  if arr[i]<arrMin:
     arrMin=arr[i] # arrMin을, arr중에 가장 작은값으로 초기화시키게 될거임(for문 돌면서)
print(arrMin)


# 무한대로 변수를 초기화 시키기 싫다면?? 
arrMin=arr[0] #첫 번째 값으로 초기화
for i in range(1,len(arr)) # 이렇게 해도 된다!!

1. 문제

 

 

2. 내 코드

<내가 생각한 알고리즘>

1. 학생 수 n 키보드로 입력받기

2. n명 학생의 점수 입력받기 (띄어쓰기 입력+리스트에 저장)

3. 평균 변수에, 평균값 대입

4. 평균-학생 각각 점수 = 가까운 정도 -> 리스트에 넣기?

 

N=int(input())
score=list(map(int,input().split())) #인덱스 번호+1 = 학생번호 -> 출력 시 주의

avg=sum(score)/N #74

gap=avg #차이=평균 이라는건, 차이가 젤 큰 경우 #74
stu_num=0
for i in range(len(score)):
    if abs(score[i]-avg) < gap:
        gap=score[i] 
        stu_num=i+1
    if abs(score[i]-avg) == gap:
        gap = max(abs(score[i]-avg),gap) #둘중 큰 값을 넣기 #점수차이 중복 해결
        stu_num=i+1

print(avg,stu_num,sep=' ')

>

 

> 실행은 됐는데, 또 이상한 값 출력됨 + 평균 반올림 하는거도 까먹음 ㅠㅠ

 

3. 답

학생 번호를 단지 인덱스로 다루는게 아니라, idx라는 변수로 따로 다루었다.

n=int(input())
score_lst=list(map(int,input().split())) #인덱스 번호+1 = 학생번호 -> 출력 시 주의
# 리스트를 하나씩 탐색하면서(for문), 평균과 가장 가까운 값 알아야함
avg=round(sum(score_lst)/n) #74
min=2147000000 #터무늬없는 정수형 형태 가장 큰 숫자 대충 최소값으로 초기화
# enumerate함수 사용
for idx,x in enumerate(score_lst):
    tmp=abs(x-avg)
    if tmp<min:
        min=tmp
        score=x #score에 점수값도 저장해야함(나중에 비교 위해)
        stu_num=idx+1 # 학생 번호도 저장
    elif tmp==min: # 같은 거리를 같는 점수가 있다면
        if x>score: # 여기서 등호 포함시켜버리면, 가장 빠른 번호가 아니라, 뒷번호로 학생 번호가 초기화되게 된다
            score=x
            stu_num=idx+1
print(avg,stu_num)

+) 수정

a=67.5
a=a+0.5
a=int(a)
print(a) //이런 방식으로 수정하자. round함수 때문에

4. 반성한 점+ 깨달은 점

 

  • for문을 돌면서, 비교하고 계속 값을 초기화해가는 과정이 헷갈렸다. 너무
  •  enumerate에 대해 기초 강의에서 배웠었는데 써먹지 못했다. 이 개념에 대해 더 공부해보자.

5. 새로 알게된 점

  •  변수명 = float('inf')

: 변수에, 파이썬에서 가장 큰 값(무한대값)이 할당되는 문법!

  • 소수 첫째자리에서 반올림해서 정수화

--> round함수

***단, 파이썬에서 round함수는, round_half_even방식을 택한다

-> 4.5 처럼, 정확하게 절반지점에서는, 짝수에 가까운 쪽을 택하기에, 4가 나온다.

  • enumerate(리스트 이름)

: 탐색 시, 인덱스 값과 실제 값을 같이 반환해준다

for idx, value in enumerate(lst)

: lst 원소 탐색하면서, 인덱스 번호랑 그 값을 같이 탐색