반응형
밑의 링크는 프로그래머스에서의 문제 링크입니다.
생각한 풀이 과정
- 학생들의 학점을 순서대로 저장할 변수 grades를 선언합니다. 문자열 형태로 반환해야 하므로 빈 문자열로 초기화합니다.
- 학생들의 수를 저장하는 변수 student_cnt를 선언합니다.
- 0번부터 끝번 학생까지 반복해봅니다.
- 현재 번호의 학생이 받은 점수들을 저장할 리스트 변수 cur_student_scores를 선언합니다.
- 자기 자신을 포함한 모든 학생들로부터 현재 번호의 학생이 받은 점수들을 하나씩 cur_student_scores에 넣어줍니다.
- 현재 번호의 학생이 받은 점수들 cur_student_scores에서 최댓값과 최솟값을 구하고, 각각 변수 max_score, min_score에 넣어줍니다.
- 그 최댓값과 최솟값의 개수를 구하고 max_cnt, min_cnt에 넣어줍니다.
- 현재 번호의 학생이 자기 자신한테 평가한 점수를 변수 self_score에 저장합니다.
- 현재 번호의 학생이 받은 점수들의 합계를 변수 score_sum에 저장합니다.
- 현재 번호의 학새이 받은 점수들의 개수를 변수 score_cnt에 저장합니다.
- 현재 번호의 학생이 자기 자신한테 평가한 점수가 유일한 최고점 또는 유일한 최고점이라면, 그 점수는 제외하고 평균을 구해야 하므로, score_sum에서 self_score를 빼고, score_cnt에도 1을 뺍니다.
- 현재 번호의 학생이 받은 점수로 평균을 계산해 변수 avg에 넣어줍니다.
- 평균이 90점 이상이라면 grades에 A를 넣어줍니다.
- 평균이 80점 이상 90점 미만이라면 grades에 B를 넣어줍니다.
- 평균이 70점 이상 80점 미만이라면 grades에 C를 넣어줍니다.
- 평균이 50점 이상 70점 미만이라면 grades에 D를 넣어줍니다.
- 평균이 50점 미만이라면 grades에 F를 넣어줍니다.
- 모든 학생들의 학점을 구할 때까지 과정 4 ~ 과정 17을 반복합니다.
- 모든 학생들의 학점을 구했으면, 모든 학생들의 학점 문자열인 grades의 값을 반환합니다.
제출한 파이썬 코드
# 학생들의 점수가 담긴 정수형 2차원 리스트 scores가 매개변수로 주어집니다.
def solution(scores):
# 학생들의 학점을 순서대로 문자열로 저장할 변수를 선언합니다.
grades = ''
# 학생들의 수를 저장하는 변수를 선언합니다.
student_cnt = len(scores)
# 0번 학생부터 끝까지 한 명씩 반복해봅니다.
for student_num in range(student_cnt):
# 현재 번호의 학생이 받은 점수들을 저장할 리스트 변수를 선언합니다.
cur_student_scores = []
# 자기 자신을 포함한 모든 학생들이 현재 번호의 학생에 준 점수를 반복문으로 확인해봅니다.
for idx in range(student_cnt):
# 과제를 평가한 점수를 저장하는 변수를 선언합니다.
score = scores[idx][student_num]
# cur_student_scores에 점수를 넣어줍니다.
cur_student_scores.append(score)
# 현재 번호의 학생이 받은 점수 중 가장 높은 점수를 저장하는 변수를 선언합니다.
max_score = max(cur_student_scores)
# 점수 중에서 가장 높은 점수의 개수를 저장하는 변수를 선언합니다.
max_cnt = cur_student_scores.count(max_score)
# 현재 번호의 학생이 받은 점수 중 가장 낮은 점수를 저장하는 변수를 선언합니다.
min_score = min(cur_student_scores)
# 점수 중에서 가장 낮은 점수의 개수를 저장하는 변수를 선언합니다.
min_cnt = cur_student_scores.count(min_score)
# 현재 번호의 학생이 자기 자신한테 평가한 점수를 저장하는 변수를 선언합니다.
self_score = cur_student_scores[student_num]
# 현재 번호의 학생이 받은 점수들의 합을 저장하는 변수를 선언합니다.
score_sum = sum(cur_student_scores)
# 현재 번호의 학생이 받은 점수 개수를 저장하는 변수를 선언합니다.
score_cnt = len(cur_student_scores)
# 현재 번호의 학생이 자기 자신한테 평가한 점수가 가장 높은 점수이며, 그 점수가 유일한 최고점이라면
if max_score == self_score and max_cnt == 1:
# 점수 합계에서 자기 자신한테 평가한 점수를 빼줍니다.
score_sum -= self_score
# 점수의 개수에도 한 개를 빼줍니다.
score_cnt -= 1
# 현재 번호의 학생이 자기 자신한테 평가한 점수가 가장 낮은 점수이며, 그 점수가 유일한 최저점이라면
elif min_score == self_score and min_cnt == 1:
# 점수 합계에서 자기 자신한테 평가한 점수를 빼줍니다.
score_sum -= self_score
# 점수의 개수에도 한 개를 빼줍니다.
score_cnt -= 1
# 현재 번호의 학생의 평균을 저장하는 변수를 선언합니다.
avg = score_sum / score_cnt
# 평균이 90점 이상이라면
if avg >= 90:
# grade에 A를 넣어줍니다.
grades += 'A'
# 평균이 80점 이상 90점 미만이라면
elif 80 <= avg < 90:
# grade에 B를 넣어줍니다.
grades += 'B'
# 평균이 70점 이상 80점 미만이라면
elif 70 <= avg < 80:
# grade에 C를 넣어줍니다.
grades += 'C'
# 평균이 50점 이상 70점 미만이라면
elif 50 <= avg < 70:
# grade에 D를 넣어줍니다.
grades += 'D'
# 그 외의 경우, 즉, 평균이 50점 미만이라면
else:
# grade에 F를 넣어줍니다.
grades += 'F'
# 학생들의 학점들을 반환합니다.
return grades
제출 결과
느낀 점
알고리즘 문제가 아닌 실제 서비스 개발이었다면
한 학생의 평균 점수를 구하는 부분과 그 평균에 대한 학점을 구하는 부분을 다른 함수들로 구현했을 것 같습니다.
문제를 풀고 나서 다른 사람들의 코드들을 읽어보니 실제로 그렇게 구현한 사람들이 많았습니다.
※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.
※ 더 효율적이고 빠른 정답을 환영합니다.
반응형
댓글