[프로그래머스] 상호평가

chanyeong kim·2021년 9월 15일
0

프로그래머스

목록 보기
2/51

📩 -->문제설명

대학 교수인 당신은, 상호평가를 통하여 학생들이 제출한 과제물에 학점을 부여하려고 합니다. 아래는 0번부터 4번까지 번호가 매겨진 5명의 학생들이 자신과 다른 학생의 과제를 평가한 점수표입니다.

No.01234
010090988865
15045998577
24788958065
361571008065
42490947565
평균45.581.2597.281.667.8
학점FBABD

학생들의 점수가 담긴 정수형 2차원 배열 scores가 매개변수로 주어집니다. 이때, 학생들의 학점을 구하여 하나의 문자열로 만들어서 return 하도록 solution 함수를 완성해주세요!

제한사항

  • 2 ≤ scores의 행의 길이(학생 수) ≤ 10
  • scores의 열의 길이 = scores의 행의 길이
    - 즉, scores는 행과 열의 길이가 같은 2차원 배열입니다.
  • 0 ≤ scores의 원소 ≤ 100
  • return 값 형식
    - 0번 학생의 학점부터 차례대로 이어 붙인 하나의 문자열을 return 합니다.

입출력 예

scoresresult
[[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"
[[50,90],[50,87]]"DA"
[[70,49,90],[68,50,38],[73,31,100]]"CFD"

기준

평균학점
90점 이상A
80점 이상 90점 미만B
70점 이상 80점 미만C
50점 이상 70점 미만D
50점 미만F

💡 solution(사용언어: python)

def solution(scores):
    answer = ''
    result = []
    for i in range(0, len(scores)):
        mean=0
        s_scores=[]
        for j in range(0, len(scores)):
            s_scores.append(scores[j][i])

        mx = max(s_scores)
        mn = min(s_scores)
    
        if s_scores[i] == mx and s_scores.count(s_scores[i])==1: 
            s_scores[i] = 0
        if s_scores[i] == mn and s_scores.count(s_scores[i])==1:
            s_scores[i] = 0

        if 0 in s_scores:
            mean = sum(s_scores) / (len(s_scores)-1)
            result.append(mean)
        else:
            mean = sum(s_scores) / len(s_scores)
            result.append(mean)    

    for i in result:
        if i >= 90:
            i='A'
        elif i >=80 and i<90:
            i='B'
        elif i >=70 and i<80:
            i='C'
        elif i >=50 and i<70:
            i='D'
        else :
            i='F'
        answer += i
    
    return answer

👉 설명

이 문제는 배열을 transpose 하는게 핵심이지만, 일단 transpose 하지 않고 일단 for문으로 풀어봤다!

answer: 학생들의 학점을 담은 문자열
result: 각 학생의 평균을 담은 리스트
mx: 각각 학생 점수의 최고점
mn: 각각 학생 점수의 최저점

    for i in range(0, len(scores)):
        mean=0
        s_scores=[]
        for j in range(0, len(scores)):
            s_scores.append(scores[j][i])

        mx = max(s_scores)
        mn = min(s_scores)
  1. 각 학생별로 점수를 s_scores 리스트에 담은 후, 점수별 최고점을 mx에 최저점을 mn에 저장한다.
        if s_scores[i] == mx and s_scores.count(s_scores[i])==1: 
            s_scores[i] = 0
        if s_scores[i] == mn and s_scores.count(s_scores[i])==1:
            s_scores[i] = 0
  1. s_scores[i]는 학생이 자기 자신에게 부여한 점수를 의미하고, 유일한 최대값 또는 유일한 최소값이라면 0으로 바꿔주었다.
        if 0 in s_scores:
            mean = sum(s_scores) / (len(s_scores)-1)
            result.append(mean)
        else:
            mean = sum(s_scores) / len(s_scores)
            result.append(mean) 
  1. s_scores에 0이 있다면 평균을 구할 때 s_scores에서 하나 빼주었고(문제 조건만족을 위해) 0이 없으면 그대로 평균을 구해주었다.

결과

다른 풀이

def solution(lottos, win_nums):

    rank=[6,6,5,4,3,2,1]

    cnt_0 = lottos.count(0)
    ans = 0
    for x in win_nums:
        if x in lottos:
            ans += 1
    return rank[cnt_0 + ans],rank[ans]

🌈 느낀 점

추석 때 집 내려가면서 비행기에서 코드 짰던게 기억이 난다. 배열을 transpose 하지 않고 그냥 for문으로만 돌려도 풀 수 있는 문제였지만, 효율성을 위해 for 문을 자제 해보는 습관을 길러봐야겠다

출처: 프로그래머스

0개의 댓글