월하점
월하점의 개발 공부 일지
월하점
전체 방문자
오늘
어제
  • 분류 전체보기 (96)
    • Back-end (3)
    • PROJECT (1)
    • CS (15)
      • Operating System (0)
      • Network (4)
      • Data Structure (7)
      • Algorithm (0)
      • Database (4)
    • Problem Solving (52)
    • Programming Languages (1)
      • Javascript (0)
      • Python (1)
      • JAVA (0)
    • Codestates BEB 4기 (7)
    • Blockchain (12)
    • Linux (2)
    • Git (1)
    • 잡다한 (2)

공지사항

인기 글

태그

  • 프로그래머스
  • 알고리즘
  • Python
  • SWEA
  • baekjoon
  • 자료구조
  • javascript
  • 네트워크
  • CS
  • node.js
  • django

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
월하점

월하점의 개발 공부 일지

  • HOME
  • GUEST
  • WRITE
[SWEA] D2 - 1983. 조교의 성적 매기기 in 파이썬
Problem Solving

[SWEA] D2 - 1983. 조교의 성적 매기기 in 파이썬

2022. 5. 17. 04:43

문제 출처

 

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부터 시작한다.)

 

 


 

문제 풀이

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
    'Problem Solving' 카테고리의 다른 글
    • [SWEA] D2 - 1979. 어디에 단어가 들어갈 수 있을까 in 파이썬
    • [SWEA] D2 - 2001. 파리 퇴치 in 파이썬
    • [SWEA] D2 - 2005. 파스칼의 삼각형 in 파이썬
    • [JS 알고리즘] Toy 6 - sudoku 스도쿠
    월하점
    월하점
    개발 공부를 기록합니다. 웹을 위주로 공부하며 컴퓨터과학 이론도 함께 정리할 계획입니다.

    티스토리툴바