오늘은 프로그래머스의 위클리 챌린지인 상호 평가
를 풀어보았다.
대학 교수인 당신은, 상호평가를 통하여 학생들이 제출한 과제물에 학점을 부여하려고 합니다. 아래는 0번부터 4번까지 번호가 매겨진 5명의 학생들이 자신과 다른 학생의 과제를 평가한 점수표입니다.
위의 점수표에서, i행 j열의 값은 i번 학생이 평가한 j번 학생의 과제 점수입니다.
당신은 각 학생들이 받은 점수의 평균을 구하여, 기준에 따라 학점을 부여하려고 합니다.
만약, 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수는 제외하고 평균을 구합니다.
def solution(scores):
answer = []
mean = 0
for j in range(len(scores)):
tmp = []
for i in range(len(scores)):
tmp.append(scores[i][j])
if min(tmp) == tmp[j] or max(tmp) == tmp[j]:
a = tmp[j]
tmp.remove(a)
if a in tmp:
tmp.insert(j, a)
mean = sum(tmp) / len(tmp)
else:
mean = sum(tmp) / len(tmp)
else:
mean = sum(tmp) / len(tmp)
if mean >= 90:
answer.append('A')
elif mean >= 80:
answer.append('B')
elif mean >= 70:
answer.append('C')
elif mean >= 50:
answer.append('D')
else:
answer.append('F')
return ''.join(answer)
각 학생이 받은 점수를 리스트 형태로 저장한 뒤, 최소값 혹은 최대값인지 확인해주었다. 문제에서 '유일한' 최소 혹은 최대값이라고 했으므로 한 번 더 검증하는 조건절을 넣어주었다. 조건에 맞게 평균을 산출한 뒤, 학점을 Answer에 저장하면 끝.
def solution(scores) :
avgs=[]
score=[ [i[j] for i in scores] for j in range(len(scores))]
for idx,i in enumerate(score) :
avg=sum(i) ; length=len(i)
if i[idx] == max(i) or i[idx] == min(i) :
if i.count(i[idx]) == 1 :
avg-=i[idx] ; length-=1
avgs.append(avg/length)
return "".join([ avg>=90 and "A" or avg>=80 and "B" or avg>=70 and "C" or avg>=50 and "D" or "F" for avg in avgs ])
scores를 transpose하여 새로운 행렬을 생성해주는 방식이다.
score = [ [i[j] for i in scores] for j in range(len(scores))]
j를 0~4까지 반복문을 돌리면서 각 행의 j번째 원소를 리스트로 나타내는 방식으로 전치 행렬을 구하는 것을 배울 수 있었다.
아무튼
자유자재로 코드를 적어나가고 싶다.