문제
학기가 끝나고, 학생들의 점수로 학점을 계산중이다.
학점은 상대평가로 주어지는데, 총 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부터 시작한다.)
문제 풀이
1. 각 학생의 총점을 리스트에 저장
2. 총점 리스트를 내림차순 정렬
3. k번째 학생의 총점 순위 구하기
3-1. k번째 학생의 총점 구하기
3-2. 내림차순 정렬 리스트에서 k번째 학생의 총점이 몇번째 인덱스에 위치하는지 구하기
4. k번째 학생의 총점 순위는 어느 평점에 속하는지 구하기
4-1. 각 평점 당 학생 수 구하기
4-2. 받게될 평점의 인덱스 번호 = "(총점 순위) / (평점 당 학생 수)"의 몫
[변수의 범위]
k : 1 <= k <= N
총점 리스트 인덱스 i : 0 <= i <= N-1
총점 순위 rank : 0 <= rank <= N-1
작성 코드
import sys
sys.stdin = open("input.txt", "r")
def solve(N, k, total):
# k: 1 <= k <= N
# k_rank: k번째 학생의 총점 순위 (순위:0~N-1)
desc_total = sorted(total, reverse=True)
# k는 1부터 시작하지만, 리스트 인덱스는 0부터 시작하므로 k-1 (예: k=2라면 2번째 입력받은 학생 -> total[1]가 2번째 학생의 총점)
k_score = total[k-1]
k_rank = desc_total.index(k_score)
# 각 평점당 학생 수 ("//": 몫 연산자)
n = N // 10
# k번째 학생의 평점: "(순위) / (평점당 명수)" 의 몫 = 평점의 인덱스
idx = k_rank // n
return grade[idx]
T = int(input())
grade = ['A+','A0','A-','B+','B0','B-','C+','C0','C-','D0'] # 평점 순서 주의!...
for test_case in range(1, T + 1):
N, k = map(int, input().split())
total = [0] * N # total: 0번째부터 N-1번째 학생의 총점을 담고 있는 리스트
for i in range(N):
mid, fin, ass = map(int, input().split())
total[i] += (mid * 0.35) + (fin * 0.45) + (ass * 0.2)
result = solve(N, k, total)
print(f'#{test_case} {result}')
배운 점
1. //
: 몫 연산자
2. 조건을 적을 때 오타나 순서를 주의하자
로직 구현은 어렵지 않았는데, 자꾸만 출력 결과가 묘하게 순서가 바뀌어서 나와서 굉장히 시간을 많이 잡아먹었다.
디버깅을 해봐도 내 로직에 틀린점은 없는데 왜 출력 결과는 이상할까 하고 계속 들여다 봤더니...
아니나 다를까, 평점 순서를 이상하게 적었었다^^...
grade = ['A+','A0','A-','B+','B0','B-','C+','C0','C-','D0']
라고 적어야 하는데,
grade = ['A+','A0','A-','B+','B-','B0','C+','C-','C0','D0']
라고 적었던 것이다.... ^^..
어쩐지 0, - 가 서로 바뀌어서 나오더라니... 이런 실수에 오랜 시간을 들이다니 허무하다...
그치만 오타 실수 없는 것도 실력이니까... 조건을 적을 땐 정신 똑바로 차리고! 꼼꼼하게! 다시 한 번 더 확인하는 습관을 가져보자..
'Problem Solving' 카테고리의 다른 글
[SWEA] D2 - 1979. 어디에 단어가 들어갈 수 있을까 in 파이썬 (0) | 2022.05.17 |
---|---|
[SWEA] D2 - 2001. 파리 퇴치 in 파이썬 (0) | 2022.05.17 |
[SWEA] D2 - 2005. 파스칼의 삼각형 in 파이썬 (0) | 2022.05.17 |
[JS 알고리즘] Toy 6 - sudoku 스도쿠 (0) | 2022.05.16 |
[JS 알고리즘] Toy 5 - tiling 타일링 (0) | 2022.05.16 |