[Programmers] 상호 평가 (Python)
문제
https://programmers.co.kr/learn/courses/30/lessons/83201
접근 방식
- 학생 별 평가 점수 리스트 생성
- 조건에 따라 점수 제외
- 평균 리스트 생성
- 평균에 따라 학점을 문자열에 저장한 후 return
제출 코드
def solution(scores):
eval_score = []
average = []
grade = ''
#학생 별 평가 점수 리스트 생성(eval_score)
for i in range(len(scores)):
temp = []
for j in range(len(scores)):
temp.append(scores[j][i])
eval_score.append(temp)
#문제 조건에 따른 점수 제외
for k in range(len(eval_score)):
if eval_score[k][k] == max(eval_score[k]) and eval_score[k].count(eval_score[k][k]) == 1:
del eval_score[k][k]
elif eval_score[k][k] == min(eval_score[k]) and eval_score[k].count(eval_score[k][k]) == 1:
del eval_score[k][k]
else:
continue
#학생 별 평균 리스트 생성(average)
for i in range(len(eval_score)):
average.append(sum(eval_score[i]) / len(eval_score[i]))
#학점 문자열 생성(grade)
for k in range(len(average)):
if average[k] >= 90: grade += 'A'
elif average[k] >= 80: grade += 'B'
elif average[k] >= 70: grade += 'C'
elif average[k] >= 50: grade += 'D'
else: grade += 'F'
return grade
느낀점
반복문을 총 5번 사용하였는데, 다른 사람들의 풀이를 보니 굉장히 간단하고 효율적이게 짠 코드들을 많이 발견할 수 있었다. 많이 부족한 내 코드를 더 정제해서 반복문을 적게 쓰는 코드를 작성해 보기로 했다.
접근 방식
- 학생 별 평가 점수 리스트 생성
- 문제 조건에 따른 점수 제외 후 평균에 따른 학점 저장
정제 코드
def solution(scores):
eval_score = []
grade = ''
#학생 별 평가 점수 리스트 생성(eval_score)
for i in range(len(scores)):
temp = []
for j in range(len(scores)):
temp.append(scores[j][i])
eval_score.append(temp)
#문제 조건에 따라 점수 제외 후 평균점수에 따른 학점 저장
for k in range(len(eval_score)):
if eval_score[k][k] == max(eval_score[k]) and eval_score[k].count(eval_score[k][k]) == 1:
del eval_score[k][k]
elif eval_score[k][k] == min(eval_score[k]) and eval_score[k].count(eval_score[k][k]) == 1:
del eval_score[k][k]
avg = sum(eval_score[k]) / len(eval_score[k])
if avg >= 90: grade += 'A'
elif avg >= 80: grade += 'B'
elif avg >= 70: grade += 'C'
elif avg >= 50: grade += 'D'
else: grade += 'F'
return grade
많이 깔끔해졌지만 여전히 반복문이 많이 사용된다. 특히 행렬의 행과 열을 바꾸는 함수를 사용한다면, 이중반복문을 없앨 수 있었고, 다른 분들의 풀이를 보니 for문에 enumerate을 사용해서 간단하게 푸는 것을 확인하였고, 다시 새로 코드를 작성해보았다.
새로 작성한 코드
def solution(scores):
grade = ''
#함수의 행과 열을 바꿈
eval_score = list(map(list, zip(*scores)))
#문제 조건에 따라 점수 제외 후 평균점수에 따른 학점 저장
for i, score in enumerate(eval_score):
if score[i] == max(score) and score.count(score[i]) == 1:
del score[i]
elif score[i] == min(score) and score.count(score[i]) == 1:
del score[i]
avg = sum(eval_score[i]) / len(eval_score[i])
if avg >= 90: grade += 'A'
elif avg >= 80: grade += 'B'
elif avg >= 70: grade += 'C'
elif avg >= 50: grade += 'D'
else: grade += 'F'
return grade
- 함수의 행과 열을 바꾸는 구문은 어떤 구조로 동작하는지 아직 이해하지 못함.
- zip함수는 리스트의 병렬처리가 필요할 때 주로 사용 (2개의 리스트를 묶어 주로 사전으로 사용)
- enumerate이 필요한 경우 능숙하게 사용할 수 있도록 항상 머릿속에 기억
Author And Source
이 문제에 관하여([Programmers] 상호 평가 (Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minob_b/Programmers-상호-평가-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)