728x90

문제

학기가 끝나고, 학생들의 점수로 학점을 계산중이다.
학점은 상대평가로 주어지는데, 총 10개의 평점이 있다.

 


학점은 학생들이 응시한 중간/기말고사 점수 결과 및 과제 점수가 반영한다.
각각 아래 비율로 반영된다.

 


10 개의 평점을 총점이 높은 순서대로 부여하는데,
각각의 평점은 같은 비율로 부여할 수 있다.


예를 들어, N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여할 수 있다.


입력으로 각각의 학생들의 중간, 기말, 과제 점수가 주어지고,
학점을 알고싶은 K 번째 학생의 번호가 주어졌을 때,
K 번째 학생의 학점을 출력하는 프로그램을 작성하라.

 

제약 사항

1. N은 항상 10의 배수이며, 10이상 100이하의 정수이다. (10 ≤ N ≤ 100)
2. K는 1 이상 N 이하의 정수이다. (1 ≤ K ≤ N)
3. K 번째 학생의 총점과 다른 학생의 총점이 동일한 경우는 입력으로 주어지지 않는다.

 

입력

입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스의 첫 번째 줄은 학생수 N 과, 학점을 알고싶은 학생의 번호 K 가 주어진다.
테스트 케이스 두 번째 줄 부터 각각의 학생이 받은 시험 및 과제 점수가 주어진다.

 

출력

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

예제

[입력] [출력]
10
10 2
87 59 88
99 94 78
94 86 86
99 100 99
69 76 70
76 89 96
98 95 96
74 69 60
98 84 67
85 84 91
#1 A-
...

 

문제 해결 방법

  • 파이썬의 딕셔너리 자료형을 이용하여 풀 수 있었던 문제였다.
  • 모든 학생들의 성적을 입력 받아 총점을 구한 후, 각 총점을 딕셔너리 객체에 넣는다.
    • 이때, 딕셔너리의 키(Key) 값을 총점을 넣었을 때의 순서(학생 번호라고 하자. @student_number@)로 지정한다.
    • 이제 이 키(Key) 값을 이용하여 언제든지 N번째 학생의 점수(Value)를 불러올 수 있게 된다.
total_score_dict = {}
for student_number in range(1, N + 1):
    score_list = list(map(float, input().split()))
    score_sum = score_list[0] * 0.35 + score_list[1] * 0.45 + score_list[2] * 0.2
    total_score_dict[student_number] = score_sum

 

  • 이제 딕셔너리 객체의 값(Value)을 기준으로 내림차순 정렬을 수행한다.
    • 딕셔너리 객체 안의 요소를 정렬하기 위해 @sorted@ 함수를 사용한다.
# 값(value)을 기준으로 내림차순 정렬하기
sorted_total_score_dict = dict(sorted(total_score_dict.items(), key=lambda item: item[1], reverse=True))    # item[0] : key, item[1] : value

 

  • 이제 각 요소의 값(Value)을 바꿔준다.
  • @for key, value in my_dict.items()@와 같이 for 문을 사용함으로서 첫 번째 키부터 마지막 키까지 모두 접근한다. 이때, @count@ 값을 하나씩 증가시켜주면서 @count@ 값이 입력 받은 전체 학생의 수(@N@)의 특정 비율 안에 포함될 경우, 딕셔너리에서 해당 키(Key)의 값(Value)을 문제에 제시된 학점으로 바꿔준다.
    • 상위 10%(A+) ~ 하위 10%(D0)
# 값(value)을 바꾸기
count = 0
grade = ''
for key, value in sorted_total_score_dict.items():
    count += 1

    if count <= N * 0.1:
        grade = 'A+'
    elif count <= N * 0.2:
        grade = 'A0'
    elif count <= N * 0.3:
        grade = 'A-'
    elif count <= N * 0.4:
        grade = 'B+'
    elif count <= N * 0.5:
        grade = 'B0'
    elif count <= N * 0.6:
        grade = 'B-'
    elif count <= N * 0.7:
        grade = 'C+'
    elif count <= N * 0.8:
        grade = 'C0'
    elif count <= N * 0.9:
        grade = 'C-'
    elif count <= N * 1.0:
        grade = 'D0'

    sorted_total_score_dict[key] = grade

 

  • 최종적으로 @sorted_total_score_dict@ 딕셔너리 객체 안에는 값(Value)이 큰 순서대로 {키-값}이 들어있게 되며, @sorted_total_score_dict[K]@이 정답이 된다.
answer = sorted_total_score_dict[K]

 

코드

T = int(input())

for test_case in range(1, 1 + T):
    N, K = map(int, input().split())

    # 1번부터 N번까지 학생들의 총점을 딕셔너리에 넣기
    total_score_dict = {}
    for student_number in range(1, N + 1):
        score_list = list(map(float, input().split()))
        score_sum = score_list[0] * 0.35 + score_list[1] * 0.45 + score_list[2] * 0.2
        total_score_dict[student_number] = score_sum
    
    # 값(value)을 기준으로 오름차순 정렬하기
    sorted_total_score_dict = dict(sorted(total_score_dict.items(), key=lambda item: item[1], reverse=True))    # item[0] : key, item[1] : value

    # 값(value)을 바꾸기
    count = 0
    grade = ''
    for key, value in sorted_total_score_dict.items():
        count += 1
        
        if count <= N * 0.1:
            grade = 'A+'
        elif count <= N * 0.2:
            grade = 'A0'
        elif count <= N * 0.3:
            grade = 'A-'
        elif count <= N * 0.4:
            grade = 'B+'
        elif count <= N * 0.5:
            grade = 'B0'
        elif count <= N * 0.6:
            grade = 'B-'
        elif count <= N * 0.7:
            grade = 'C+'
        elif count <= N * 0.8:
            grade = 'C0'
        elif count <= N * 0.9:
            grade = 'C-'
        elif count <= N * 1.0:
            grade = 'D0'
        
        sorted_total_score_dict[key] = grade
    
    answer = sorted_total_score_dict[K]

    print(f"#{test_case} {answer}")

 

참고

  • 난이도: D2

 

@sorted@ 함수

sorted(iterable, key=None, reverse=False)

 

설명

  • @sorted()@ 함수는 파이썬에서 사용되는 내장 함수 중 하나로, 순서가 정의된 iterable (반복 가능한) 객체를 정렬하는 데 사용된다.
  • 이 함수는 기본적으로 오름차순으로 정렬하며, 정렬된 결과를 새로운 리스트로 반환한다. (원본 iterable 객체는 변경되지 않는다.)
매개변수 설명
iterable - 정렬하려는 iterable 객체
- 예) 리스트, 튜플, 문자열 등
key [선택] - 정렬 기준을 지정하는 함수
- 이 함수를 사용하면 정렬을 원하는 대상을 선택할 수 있다.
- 기본값은 @None@이며, 이 경우 iterable의 요소 자체를 비교하여 정렬한다.
- 예) 딕셔너리의 값을 기준으로 정렬하거나, 문자열의 길이를 기준으로 정렬하는 등 다양한 기준을 사용할 수 있다.
reverse [선택] - @True@로 설정하면 내림차순 정렬을 수행한다.
- 기본값은 @False@로, 오름차순 정렬을 수행한다.

 

사용 예

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)  # 오름차순으로 정렬
print(sorted_numbers)  # 출력: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
728x90