본문 바로가기
  • 시 쓰는 개발자
알고리즘/코테 스터디 (2024)

SWEA 1983 조교의 성적 매기기 (핵심 : 순서와 값 함께 저장하는 방법)

by poetDeveloper 2024. 10. 4.
반응형

💡문제 분석 요약

  • 주어진 학생들의 중간, 기말, 과제점수를 비율별로 종합하여 등급을 매긴다.
  • 등급은 총 10개 등급이 있고, 각 등급마다 10% 학생들이 차지하게 된다. (ex. A+ 10%, A0 10% ...)
  • 이때, 특정 순서에 있는 학생의 학점을 출력한다.

💡알고리즘 설계

  • 처음엔 dictionary를 생각했다. 왜냐면 학생의 "순서"와 value를 함께 저장하는 방법이라고 생각했기 때문.
  • 그래서 student[순서] = A+ 이런느낌으로 저장하려 했는데, 정렬 부분에서 잘 안됐다.
  • 따라서 우린 students에 튜플 자체를 append하는 방식을 사용한다. (순서, 학점) 형식으로 튜플을 통째로 append해준다.

💡코드

t = int(input())
for test_case in range(t):
    n, k = map(int, input().split())
    students = []
    grade = ['D0', 'C-', 'C0', 'C+', 'B-', 'B0', 'B+', 'A-', 'A0', 'A+']
    for i in range(1, n+1):
        mid, final, hw = map(int, input().split())
        total = 0.35*mid + 0.45*final + 0.2*hw
        students.append((i, total)) # 순서랑 토탈값 같이 저장
        # students.append([i, total]) # 이렇게 리스트를 넣어주면 아래 students[i][1]만 업데이트 하는 것 가능

    # 총점 기준으로 내림차순 정렬
    students.sort(key=lambda x: x[1])
    per_grade = n // 10 # 몇명씩 학점 줄지에 대한 단위

    for i in range(n):
        # students[i][1] = grade[i // per_grade] 이거는 튜플이라서 안됨. But 위에처럼 리스트를 넣어주면 됨
        students[i] = (students[i][0], grade[i // per_grade])

    for i in range(n):
        if students[i][0] == k:
            print(f"#{test_case+1}", students[i][1])
            break

💡시간복잡도

  • N까지 가는 for문만 2개이므로 O(N+N)  = O(N)

💡 틀린 이유, 수정

  • 순서를 함께 고려하는 방법을 몰라서 틀렸다. → 튜플에 순서와 값을 함께 넣는 방식
  • grade라는 리스트를 만들어서 10개 학점을 관리해야겠다는 생각을 떠올리는데 오래걸렸다.
  • students[i]의 값을 업데이트할 때 "튜플 형식으로" 업데이트 해야하는 것을 몰라서 students[i][1] 만 업데이트하려고 쓰다가 tuple은 수정할 수 없다고 해서 계속 틀렸다. 그래서 튜플 통째로 갈아끼워넣는 식으로 진행했다. → 수정) 이거 튜플을 넣으면 안되는게 맞는데, [i, total] 이런식으로 리스트를 넣어주면 students[i][1] 만 업데이트하는 것 가능함.
  • 그리고 람다식 쓰는 것을 몰라서 버벅였다. 람다식으로 정렬하는 방법 꼭!!!!!!!!!!!!!! 기억하기

💡 느낀점 or 기억할정보

  • 튜플로 순서와 값 함께 관리하기
  • 람다식으로 이차원 리스트 정렬하기
반응형