반응형
💡문제 분석 요약
- 주어진 학생들의 중간, 기말, 과제점수를 비율별로 종합하여 등급을 매긴다.
- 등급은 총 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 기억할정보
- 튜플로 순서와 값 함께 관리하기
- 람다식으로 이차원 리스트 정렬하기
반응형
'알고리즘 > 코테 스터디 (2024)' 카테고리의 다른 글
SWEA 2001 파리 퇴치 (핵심 : i+x, j+y) (0) | 2024.10.01 |
---|---|
SWEA 2007 패턴 마디의 길이 (핵심 : startswith) (0) | 2024.09.30 |
SWEA 1859 백만 장자 프로젝트 (핵심 : 맨 뒤에서부터 계산하기) (1) | 2024.09.29 |
프로그래머스 - 괄호 회전 (핵심 : 회전코드 이해) (0) | 2024.09.20 |
프로그래머스 - 방문 길이 (핵심 : line 체크) (0) | 2024.09.11 |