Stay Hungry Stay Foolish

SWEA

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

dev스카이 2023. 11. 2. 01:39

 

 

SW Expert Academy

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

swexpertacademy.com


설명

학점이 A+ 부터 D0까지 총 10개의 평점이 있다.  총점은 중간고사(35%) + 기말고사(45%) + 과제(20%) 비율로 반영된다. 10개의 평점을 총점이 높은 순서대로 부여한다.(이게 본문제) 각각의 평점은 같은 비율로 부여할 수 있다. 학점을 알고싶은 K번째 학생의 번호가 주어졌을 때 K번째 학생의 학점을 출력해야 한다.
테스트케이스의 첫 번째 줄은 학생수 N과 학점을 알고싶은 학생의 수 K가 주어진다.
테스트케이스의 두 번째 줄부터 각각의 학생이 받은 시험 및 과제 점수가 주어진다.

풀이

1. 한 리스트에 평점을 다 저장한다.
2. 시험 및 과제 비율도 있으니 100점 만점으로 환산하고 리스트에 넣는다.

3. k번째의 점수를 다른 변수에 따로 저장한다. (정렬하면 k번째를 알 수 없으니 따로 저장해두는 것)
4. 환산한 점수를 담은 리스트를 sort 함수를 사용해 정렬한다. 
5. n을 10으로 나누어서 나온 몫을 따로 저장한다.

6. 점수 리스트에서 k번째의 점수의 인덱스를 5번에서 도출된 몫으로 나누고 저장한다.
7. 학점이 저장된 리스트의 k번째를 찾아 출력한다.

 

TIL

• list.index(값) - 리스트에서 값에 해당하는 인덱스를 반환한다.

Solution

t = int(input())
grade = ["A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0"]
def calc_score(mid, fin, assi): #총점 계산
    return (0.35*mid) + (0.45*fin) + (0.2*assi) 

for i in range(1, t+1):
    n, k = map(int, input().split())
    store_score = [] #환산한 점수를 저장하기 위한 리스트
    for j in range(n): #학생들 점수 모두 입력받기
        mid, fin, assi = map(int, input().split()) #중간, 기말, 과제
        store_score.append(calc_score(mid, fin, assi)) #계산한 총점을 리스트에 모두 저장

    k_score = store_score[k-1] #k번째 점수를 따로 저장
    store_score.sort(reverse=True) #점수 리스트를 내림차순으로 정렬한다.

    value = n // 10 #문제에서 주어짐, 만약 n= 20일 때 2명씩 동일한 점수가 부여된다는 것
    ans = store_score.index(k_score) // value #점수 리스트에서 k번째의 점수의 인덱스를 value로 나눔
    print("#"+str(i),grade[ans]) #등급 중 k번째 인덱스와 동일한 학점을 반환한다.

👩‍💻 회고

t = int(input())
grade = ["A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0"]
ans = [] #결과값
def calc_score(mid, fin, assi):
    prev_score = 0
    prev_score = round((0.35*mid) + (0.45*fin) + (0.2*assi), 1) #소수점 첫째자리까지만 반올림하고 나머진 버림
    return prev_score #생각해봐야 할 점, 정수로 계산하느냐 소수점까지 계산하느냐

def rating_score(score): #학점 부여
    if k == 1:
        return grade[0]
    else:
        score[0] = grade[0]  # 첫 번째 학점 미리 부여
        for i in range(len(grade)):
            cnt = 0
            for key, value in score.items():
                if value == k: #만약 value랑 k랑 같을 때
                    return grade[i]
                elif score[key-1][value-1] == score[key][value]: #만약 이전과 동일한 점수가 아닐 때
                    score[j] = grade[i] #현재 학점을 부여하고 break
                    break #두 번째 for문 끝내기
                else: #이전과 동일한 점수이면
                    score[j] = score[j-1] #이전과 동일하게 부여
                    break

for i in range(1, t+1):
    n, k = map(int, input().split())
    store_score = [] #환산한 점수를 저장하기 위한 리스트
    for j in range(n): #학생들 점수 모두 입력받기
        mid, fin, assi = map(int, input().split()) #중간, 기말, 과제
        store_score.append(calc_score(mid, fin, assi)) #계산한 총점을 리스트에 모두 저장
        #[74.6, 92.6, 88.8, 99.5, 72.3, 85.9, 96.2, 69.0, 85.5, 85.8]
    dict_score = {int:k for k, int in enumerate(store_score)} #리스트를 딕셔너리로 변환시키고 인덱스 값 부여=딕셔너리 컴프리헨션)
    #{74.6: 0, 92.6: 1, 88.8: 2, 99.5: 3, 72.3: 4, 85.9: 5, 96.2: 6, 69.0: 7, 85.5: 8, 85.8: 9}
    score = sorted(dict_score.items(), reverse=True) #items() : 딕셔너리 key를 기준으로 내림차순 정렬
    #[(99.5, 3), (96.2, 6), (92.6, 1), (88.8, 2), (85.9, 5), (85.8, 9), (85.5, 8), (74.6, 0), (72.3, 4), (69.0, 7)]
    #딕셔너리도 함수 인자로 전달 가능하다
    print("#"+str(i),rating_score(score))

 

k번째 값을 따로 저장해 둘 생각을 못하고 너무 어렵게만 생각해서 에러나고, 시간도 오래 걸려서 결국 풀이를 봤다. 학점을 부여하는 과정이 조금 힘들었다. index 내장 함수도 알게 됐으니 다음에 이런 유형이 나온다면 값을 따로 저장해서 사용할 생각을 해보자.