728x90
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
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA-1966][Python] 숫자를 정렬하자 (1) | 2023.10.16 |
---|---|
[SWEA-1970][Python] 쉬운 거스름돈 (0) | 2023.10.16 |
[SWEA-1974][Python] 스도쿠 검증 (0) | 2023.10.16 |
[SWEA-1979][Python] 어디에 단어가 들어갈 수 있을까 (1) | 2023.10.14 |
[SWEA-1989] 초심자의 회문 검사 (1) | 2023.10.12 |
[SWEA-2001][Python] 파리 퇴치 (0) | 2023.10.12 |
[SWEA-2005][Python] 파스칼의 삼각형 (0) | 2023.10.12 |
[SWEA-2007][Python] 패턴 마디의 길이 (0) | 2023.10.11 |