등수 매기기

2024. 8. 28. 18:00코딩테스트 입문

https://school.programmers.co.kr/learn/courses/30/lessons/120882

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ score[0], score[1] ≤ 100
  • 1 ≤ score의 길이 ≤ 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

입출력 예

score result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

입출력 예 설명
입출력 예 #1

  • 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.

입출력 예 #2

  • 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
  • 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.

영어와 수학 점수의 평균을 기준으로 등수를 매기는 문제입니다.

 

이런 문제들은 이중 for문을 사용해서 모든 값들을 비교하고, 작은 값일 때 순위를 1씩 더해주는 방법이 기본 풀이라고 생각합니다.

def solution(score):
    # 순위를 기록할 rank
    rank = [1] * len(score)
    # 평균값을 기록할 mscore
    mscore = [(e + m) / 2 for e, m in score]
    # 모든 값들을 비교합니다.
    for i in range(len(mscore)):
        for j in range(len(mscore)):
            # 점수가 낮은 경우에만 순위를 1씩 더해줍니다.
            if (mscore[i] < mscore[j]):
                rank[i] += 1
    return rank

기본 풀이대로 문제를 풀었을 때입니다.

평균 값들을 전부 하나씩 비교하면서 자기보다 큰 값이 있을 때만 순위를 1씩 증가시킵니다.

동일 값에 대해서는 카운트를 안하는데, 만약 동일 순위가 있을 때 밀리는 구조라면 부등호에 =만 추가해주시면 됩니다.

 

다른 사람의 풀이 중에서 2줄만에 문제를 푸는 게 있어서 가져와봤습니다.

def solution(score):
    # 값들의 합을 기준으로 내림차순 정렬을 합니다.
    a = sorted([sum(i) for i in score], reverse = True)
    # 값들의 합을 a에서 찾아 인덱스를 반환합니다. 
    return [a.index(sum(i))+1 for i in score]

합들을 기준으로 내림차순 정렬을 해 인덱스를 순위로 사용하는 방법입니다.

그리고 score에서 i번째의 합을 a에서 찾아 index 값을 가져옵니다.

index 함수는 첫 번째 등장한 값의 인덱스를 반환하기 때문에, 동일 순위는 앞의 값으로 대체되어 가져올 수 있습니다.

 

이게 좀 더 파이썬스러운 답변인 것 같습니다.

아직 갈 길이 머네요.

'코딩테스트 입문' 카테고리의 다른 글

치킨 쿠폰  (0) 2024.08.30
로그인 성공?  (0) 2024.08.29
특이한 정렬  (0) 2024.08.27
유한소수 판별하기  (0) 2024.08.26
겹치는 선분의 길이  (0) 2024.08.25