[프로그래머스(파이썬/Python)] 상호 평가

kindof

·

2021. 8. 18. 16:31

https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 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번 문제로 나왔을만큼 어렵지 않은 문제입니다.

 

다만, 이 문제에서 가장 중요한 포인트는 "문제를 잘 읽어야 한다"는 점입니다. 알고리즘 문제를 풀 때마다 느끼는 점인데 분명 맞는데 왜 틀리지? 하는 시점이 오면 문제를 무조건 다시 읽어야 합니다. 그리고 이 상황을 미연에 방지하기 위해서도 문제를 잘 읽어야 하죠.

 

이 문제를 풀 때도 자신이 준 점수가 아닌, 자신이 받은 점수를 기준으로 생각해야 한다는 점이 중요합니다.

 

[풀이]

def setGrade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 50:
        return 'D'
    else:
        return 'F'
        
def solution(scores):
    answer = ''
    n = len(scores)

    for i in range(n):
        myScores = [] # 자신이 받은 점수
        for j in range(n):
            myScores.append(scores[j][i])
        
        # 자신의 점수가 유일한 최대 혹은 최소라면 전체 점수에서 제외
        total,count = sum(myScores), n
        myScore = myScores[i]
        if (myScore == max(myScores) or myScore == min(myScores)) and myScores.count(myScore) == 1:
            total -= myScore
            count -= 1
        answer += setGrade(total / count)
    return answer

 

ps. 다른 사람의 풀이를 보다가 행과 열을 뒤집어서 편하게 문제를 푸는 사람들을 봤다. 파이썬에서 행과 열을 Transpose할 때는 아래와 같이 zip 함수를 이용하면 된다!

my_list = [[1,2,3], [4,5,6], [7,8,9]]
transpose_list = [[], [], []]

// zip 함수 없이 바꾸기
for i in range(3):
    for j in range(3):
    	transpose_list[i].append(my_list[j][i])
        
// zip 함수 이용
transpose_list = list(map(list, zip(*my_list))