[Programmers] 상호 평가 (Python)

문제

https://programmers.co.kr/learn/courses/30/lessons/83201


접근 방식

  1. 학생 별 평가 점수 리스트 생성
  2. 조건에 따라 점수 제외
  3. 평균 리스트 생성
  4. 평균에 따라 학점을 문자열에 저장한 후 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번 사용하였는데, 다른 사람들의 풀이를 보니 굉장히 간단하고 효율적이게 짠 코드들을 많이 발견할 수 있었다. 많이 부족한 내 코드를 더 정제해서 반복문을 적게 쓰는 코드를 작성해 보기로 했다.

접근 방식

  1. 학생 별 평가 점수 리스트 생성
  2. 문제 조건에 따른 점수 제외 후 평균에 따른 학점 저장



정제 코드

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    
  1. 함수의 행과 열을 바꾸는 구문은 어떤 구조로 동작하는지 아직 이해하지 못함.
  2. zip함수는 리스트의 병렬처리가 필요할 때 주로 사용 (2개의 리스트를 묶어 주로 사전으로 사용)
  3. enumerate이 필요한 경우 능숙하게 사용할 수 있도록 항상 머릿속에 기억

좋은 웹페이지 즐겨찾기