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 원소 탐색하면서, 인덱스 번호랑 그 값을 같이 탐색