망나니 AWOS의 일상
article thumbnail

문제 설명

간단한 문제 설명

자기 자신을 평가한 점수가 다른 학생이 평가해준 점수보다 유일한 최고점이거나 최저점이라면 평균을 구할 때 제외한다. 단, 최고점이나 최저점이 여러 개라면 제외하지 않고 평균을 구하고 학점을 부여한다.

문제 풀이

처음에 주어진 함수는 이렇다.

def solution(scores):
    answer = ''
    return answer

 

위의 메서드와 입출력 예를 보면 2차원 배열의 scores가 인자로 들어가 있다.

입출력 예 1번을 풀어서 보여주겠다.

1번부터 4번까지 순서대로 보면된다.

입력을 받으면 1번과 같이 표현을 할 수 있다.

행(가로) 방향으로 보면 A학생이 A~E학생의 평가한 점수를 나타내는 것이고

열(세로) 방향으로 보면 A학생의 점수를 볼 수 있게 된다.

 

그리고 자기 자신을 평가한 점수가 간단한 설명에서도 말했다시피 유일한 최고점이거나 최저점일 경우를 생각하여 2번과 같이 표현할 수 있고 2번에서 유일한 최고점, 최저점이 걸러진 평균점수를 3번과 같이 식으로 나타낼 수 있다.

 

마지막으로 3번에서 구한 평균 점수를 4번과 같이 성적을 조건에 맞게 부여해주어 한 줄로 출력하면 된다.

 

문제 풀이 방식

그림의 1번에서 보면 열 방향으로 데이터를 보고 있기 때문에 행 X 열을 바꿔주는 작업을 해야 한다.

그래서 내가 생각한 행 X 열 뒤집기 방법은 아래와 같은 코드이다.

eval_l = [[scores[i][j] for i in range(len(scores))] for j in range(len(scores))]

문제를 풀고 나서 찾아보니 zip() 함수를 이용해 행열을 쉽게 바꿀 수 있더라...

 

파이썬을 파이썬답게 - 2차원 리스트 뒤집기 - ⭐️zip⭐️

본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코

programmers.co.kr

자기 자신을 평가한 점수가 유일한 최고점이라면 이렇게 표현할 수 있다.

일단 자기 자신을 평가한 점수가 해당 배열에서 최고점이고 최고점의 개수가 1개일 때 해당 배열에서 remove 해주는 것이다.

if eval_l[i][i] == max(eval_l[i]) and eval_l[i].count(max(eval_l[i])) == 1:
	eval_l[i].remove(eval_l[i][i])

마찬가지로 최저점도 위와 같다. 

if eval_l[i][i] == min(eval_l[i]) and eval_l[i].count(min(eval_l[i])) == 1:
	eval_l[i].remove(eval_l[i][i])

 

 

완성된 코드!!😀😀👍👍

def solution(scores):
    avg = []
    answer = ''
    eval_l = [[scores[i][j] for i in range(len(scores))] for j in range(len(scores))]
    for i in range(len(eval_l)):
        if eval_l[i][i] == max(eval_l[i]) and eval_l[i].count(max(eval_l[i])) == 1:
            eval_l[i].remove(eval_l[i][i])
        elif eval_l[i][i] == min(eval_l[i]) and eval_l[i].count(min(eval_l[i])) == 1:
            eval_l[i].remove(eval_l[i][i])
        else:
            continue
    avg += [sum(eval_l[i]) / len(eval_l[i]) for i in range(len(eval_l))]
    for score in avg:
        if score >= 90:
            answer += 'A'
        elif 80 <= score < 90:
            answer += 'B'
        elif 70 <= score < 80:
            answer += 'C'
        elif 50 <= score < 70:
            answer += 'D'
        else:
            answer += 'F'
    return answer


print(solution(
    [[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]]))
print(solution([[50, 90], [50, 87]]))
print(solution([[70, 49, 90], [68, 50, 38], [73, 31, 100]]))

 

해당 문제 프로그래머스 사이트다. 풀어볼 사람은 풀어보시길...

 

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

 

여담... 문제 끝까지 안 보고 행 X 열을 바꿔서 생각하기 전에 왜 평균이 저렇게 나오고 학점이 저렇게 부여되는지 조차 이해가 되지 않았다... 맨날 알고리즘 풀 때마다 문제 끝까지 안 보고 풀어서 항상 런타임 에러나 틀렸습니다.. 가 나오는데... 학습능력이 없는 건지... ㅋㅋㅋ 맨날 다시 보게 된다.

profile

망나니 AWOS의 일상

@AWOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!