본문 바로가기
알고리즘/프로그래머스 PS

[프로그래머스][Level 1][Python][위클리 챌린지][2주차] 상호 평가

by 빛밤하늘 2021. 8. 9.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

코딩테스트 연습 - 2주차

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

 

 

 

 

 

 

 

 

생각한 풀이 과정

  1. 학생들의 학점을 순서대로 저장할 변수 grades를 선언합니다. 문자열 형태로 반환해야 하므로 빈 문자열로 초기화합니다.
  2. 학생들의 수를 저장하는 변수 student_cnt를 선언합니다.
  3. 0번부터 끝번 학생까지 반복해봅니다.
  4. 현재 번호의 학생이 받은 점수들을 저장할 리스트 변수 cur_student_scores를 선언합니다.
  5. 자기 자신을 포함한 모든 학생들로부터 현재 번호의 학생이 받은 점수들을 하나씩 cur_student_scores에 넣어줍니다.
  6. 현재 번호의 학생이 받은 점수들 cur_student_scores에서 최댓값과 최솟값을 구하고, 각각 변수 max_score, min_score에 넣어줍니다.
  7. 그 최댓값과 최솟값의 개수를 구하고 max_cnt, min_cnt에 넣어줍니다.
  8. 현재 번호의 학생이 자기 자신한테 평가한 점수를 변수 self_score에 저장합니다.
  9. 현재 번호의 학생이 받은 점수들의 합계를 변수 score_sum에 저장합니다.
  10. 현재 번호의 학새이 받은 점수들의 개수를 변수 score_cnt에 저장합니다.
  11. 현재 번호의 학생이 자기 자신한테 평가한 점수가 유일한 최고점 또는 유일한 최고점이라면, 그 점수는 제외하고 평균을 구해야 하므로, score_sum에서 self_score를 빼고, score_cnt에도 1을 뺍니다.
  12. 현재 번호의 학생이 받은 점수로 평균을 계산해 변수 avg에 넣어줍니다.
  13. 평균이 90점 이상이라면 grades에 A를 넣어줍니다.
  14. 평균이 80점 이상 90점 미만이라면 grades에 B를 넣어줍니다.
  15. 평균이 70점 이상 80점 미만이라면 grades에 C를 넣어줍니다.
  16. 평균이 50점 이상 70점 미만이라면 grades에 D를 넣어줍니다.
  17. 평균이 50점 미만이라면 grades에 F를 넣어줍니다.
  18. 모든 학생들의 학점을 구할 때까지 과정 4 ~ 과정 17을 반복합니다.
  19. 모든 학생들의 학점을 구했으면, 모든 학생들의 학점 문자열인 grades의 값을 반환합니다.




 

 

 

 

 

제출한 파이썬 코드

# 학생들의 점수가 담긴 정수형 2차원 리스트 scores가 매개변수로 주어집니다.
def solution(scores):
    # 학생들의 학점을 순서대로 문자열로 저장할 변수를 선언합니다.
    grades = ''
    # 학생들의 수를 저장하는 변수를 선언합니다.
    student_cnt = len(scores)

    # 0번 학생부터 끝까지 한 명씩 반복해봅니다.
    for student_num in range(student_cnt):
        # 현재 번호의 학생이 받은 점수들을 저장할 리스트 변수를 선언합니다.
        cur_student_scores = []

        # 자기 자신을 포함한 모든 학생들이 현재 번호의 학생에 준 점수를 반복문으로 확인해봅니다.
        for idx in range(student_cnt):
            # 과제를 평가한 점수를 저장하는 변수를 선언합니다.
            score = scores[idx][student_num]
            # cur_student_scores에 점수를 넣어줍니다.
            cur_student_scores.append(score)

        # 현재 번호의 학생이 받은 점수 중 가장 높은 점수를 저장하는 변수를 선언합니다.
        max_score = max(cur_student_scores)
        # 점수 중에서 가장 높은 점수의 개수를 저장하는 변수를 선언합니다.
        max_cnt = cur_student_scores.count(max_score)
        # 현재 번호의 학생이 받은 점수 중 가장 낮은 점수를 저장하는 변수를 선언합니다.
        min_score = min(cur_student_scores)
        # 점수 중에서 가장 낮은 점수의 개수를 저장하는 변수를 선언합니다.
        min_cnt = cur_student_scores.count(min_score)
        # 현재 번호의 학생이 자기 자신한테 평가한 점수를 저장하는 변수를 선언합니다.
        self_score = cur_student_scores[student_num]
        # 현재 번호의 학생이 받은 점수들의 합을 저장하는 변수를 선언합니다.
        score_sum = sum(cur_student_scores)
        # 현재 번호의 학생이 받은 점수 개수를 저장하는 변수를 선언합니다.
        score_cnt = len(cur_student_scores)

        # 현재 번호의 학생이 자기 자신한테 평가한 점수가 가장 높은 점수이며, 그 점수가 유일한 최고점이라면
        if max_score == self_score and max_cnt == 1:
            # 점수 합계에서 자기 자신한테 평가한 점수를 빼줍니다.
            score_sum -= self_score
            # 점수의 개수에도 한 개를 빼줍니다.
            score_cnt -= 1
        # 현재 번호의 학생이 자기 자신한테 평가한 점수가 가장 낮은 점수이며, 그 점수가 유일한 최저점이라면
        elif min_score == self_score and min_cnt == 1:
            # 점수 합계에서 자기 자신한테 평가한 점수를 빼줍니다.
            score_sum -= self_score
            # 점수의 개수에도 한 개를 빼줍니다.
            score_cnt -= 1

        # 현재 번호의 학생의 평균을 저장하는 변수를 선언합니다.
        avg = score_sum / score_cnt

        # 평균이 90점 이상이라면
        if avg >= 90:
            # grade에 A를 넣어줍니다.
            grades += 'A'
        # 평균이 80점 이상 90점 미만이라면
        elif 80 <= avg < 90:
            # grade에 B를 넣어줍니다.
            grades += 'B'
        # 평균이 70점 이상 80점 미만이라면
        elif 70 <= avg < 80:
            # grade에 C를 넣어줍니다.
            grades += 'C'
        # 평균이 50점 이상 70점 미만이라면
        elif 50 <= avg < 70:
            # grade에 D를 넣어줍니다.
            grades += 'D'
        # 그 외의 경우, 즉, 평균이 50점 미만이라면
        else:
            # grade에 F를 넣어줍니다.
            grades += 'F'

    # 학생들의 학점들을 반환합니다.
    return grades

 

 

 

제출 결과

결과

 

 

 

 

 

 

 

 

느낀 점

알고리즘 문제가 아닌 실제 서비스 개발이었다면

한 학생의 평균 점수를 구하는 부분과 그 평균에 대한 학점을 구하는 부분을 다른 함수들로 구현했을 것 같습니다.

 

문제를 풀고 나서 다른 사람들의 코드들을 읽어보니 실제로 그렇게 구현한 사람들이 많았습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글