[문제 설명]
코딩테스트 연습 - 2주차_상호평가
[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"
programmers.co.kr
1. i행 j열 값은 i번 학생이 평가한 j번 학생의 과제 점수이다.
- 0번 학생은 자신에게 100점, 1번-90점, 2번-98점, 3번-88점, 4번-65점을 부여
2. 만약 자기 자신을 평가한 점수가 유일한 최고점, 최저점이면 그 점수를 제외하고 평균을 구함
- 0번 학생이 받은 점수들 중, 100점은 유일한 최고점이므로 제외하고 평균을 구함
- 1번 학생이 받은 점수들 중, 45점은 유일한 최저점이므로 제외하고 평균을 구함
- 4번 학생이 받은 점수들 중, 65점은 최저점 이지만 유일하지 않으므로 정상적으로 평균을 구함
3. (A : 90점 이상), (B : 80점이상~90점미만), (C : 70점이상~80점미만),
(D : 50점이상~70점미만), (E : 50점미만)
4. 학생들의 점수가 담긴 정수형 2차원 배열 scores가 매개변수로 주어집니다.
이때, 학생들의 학점을 구하여 하나의 문자열로 만들어서 return
[나의 답안]
def solution(scores):
new_scores = list(map(list, zip(*scores)))
answer = ''
for i, scores_for_i in enumerate(new_scores):
average = 0
if max(scores_for_i) == scores_for_i[i] and scores_for_i.count(scores_for_i[i]) == 1:
average = (sum(scores_for_i) - scores_for_i[i]) / (len(scores_for_i) - 1)
elif min(scores_for_i) == scores_for_i[i] and scores_for_i.count(scores_for_i[i]) == 1:
average = (sum(scores_for_i) - scores_for_i[i]) / (len(scores_for_i) - 1)
else:
average = sum(scores_for_i) / len(scores_for_i)
if average >= 90:
answer += 'A'
elif average >= 80:
answer += 'B'
elif average >= 70:
answer += 'C'
elif average >= 50:
answer += 'D'
else:
answer += 'F'
return answer
이 문제는 모기업 코딩테스트에 나왔던 걸로 기억한다.
그 때 파이썬 기본 레퍼런스만 참고할 수 있는 시험 조건이여서 억지로 구현했던 기억이 있다.
행렬 전치(transpose) 방법을 익힐 수 있는 문제이다.
※회고
1. line 7~10 번의 조건식을 합쳐서
if (max(scores_for_i) == scores_for_i[i] or min(scores_for_i) == scores_for_i[i]) and scores_for_i.count(scores_for_i[i]) == 1:
average = (sum(scores_for_i) - scores_for_i[i]) / (len(scores_for_i) - 1)
로 줄일 수 있다.
2. 다른 전치 방법 : new_scores = [ [i[j] for i in scores] for j in range(len(scores)) ]
: 매번 배열 안에서 for문을 짧게 돌리는 게 파이썬스러운 것이라고 생각하는데, C#을 치던 버릇때문에 이런 코드를 항상 못짜고,
이해하기도 힘들어서 직접 손으로 써봤다. 그렇다고 다음부터 이렇게 코드를 작성할 수 있을 지는 의문이다..
3. line 13~22 번의 조건식을 한줄로 표현이 가능하다. (대신 average를 배열에 담아둬야 함)
answer = "".join([ (avg>=90 and "A") or (avg>=80 and "B") or (avg>=70 and "C") or (avg>=50 and "D") or "F"
for avg in average_list])
파이써닉하게 코드를 짤 수 있는 그날이 빨리 오길..

'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 7주차(python) (0) | 2021.09.18 |
---|---|
[프로그래머스] 위클리 챌린지 6주차 : 복서 정렬하기(python) (0) | 2021.09.16 |
[프로그래머스] 위클리 챌린지 5주차 : 모음사전(python) (0) | 2021.09.15 |
[프로그래머스] 위클리 챌린지 4주차 : 직업군 추천하기(python) (0) | 2021.09.14 |
[프로그래머스] 위클리 챌린지 1주차 : 부족한 금액 계산하기(python) (0) | 2021.09.13 |