Coding Test/프로그래머스

[프로그래머스] 위클리 챌린지 2주차 : 상호평가(python)

hzoooo 2021. 9. 13. 21:44

[문제 설명]

 

코딩테스트 연습 - 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])

 

파이써닉하게 코드를 짤 수 있는 그날이 빨리 오길..