just inside

[SWEA/D2] 1983. 조교의 성적 매기기 본문

coding test/SWEA

[SWEA/D2] 1983. 조교의 성적 매기기

방울도마도 2024. 11. 4. 17:36
728x90

[문제 링크]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PwGK6AcIDFAUq

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


[문제 설명]

학기가 끝나고, 학생들의 점수로 학점을 계산중이다.

학점은 상대평가로 주어지는데, 총 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부터 시작한다.)


제출 코드

t = int(input())

for i in range(1, t+1):
    n, k = map(int, input().split())
    total_scores = []
    scores = ['A+','A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']
    
    # 학생 번호와 총점 계산
    for j in range(1,n+1):
        mid, final, work = map(int, input().split())
        total_scores.append((j,mid*0.35+final*0.45+work*0.2))
        
    # 총점 기준으로 정렬
    total_scores.sort(key=lambda x: x[1], reverse=True)
    
    # 순서대로 접근해서 k 학생 발견하면 점수 구간대로 학점 출력
    for idx, (stu_num, _) in enumerate(total_scores):
        if stu_num == k:
            score_idx = idx//(n//10)
            print('#'+str(i),scores[score_idx])
            break

 

풀이

  • n/10 만큼 동일한 점수를 주므로, 구간이 동일하게 된다.
  • 총점을 기준으로 정렬하고, 등수로 어떤 점수 구간에 포함되는지 확인해서 학점을 출력한다.

알아둘 사항

  • list.sort(key = lambda x: x[idx]) 로 정렬 기준을 정해줄 수 있다.
  • list.sort(reverse=True) 내림차순 정렬 가능. reversed는 리스트 자체의 함수.
  • 인덱스와 원소를 함께 꺼내주는 enumerate를 기억하자~
728x90