프로그래머스 코딩테스트 입문 "등수 매기기" 문제를 Java로 풀어봤습니다. 영어·수학 점수의 평균으로 학생들의 등수를 매기는 문제로, 이중 반복문을 이용한 직관적인 풀이로 정리했습니다.
문제 설명
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기는 문제입니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 평균 점수를 기준으로 매긴 등수를 배열로 반환하면 됩니다.
제한사항
- 0 ≤ score[0], score[1] ≤ 100
- 1 ≤ score의 길이 ≤ 10
- score의 원소 길이는 2
- score는 중복된 원소를 갖지 않음
입출력 예
| [[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] |
두 번째 예시처럼 평균 점수가 같은 학생이 있으면 공동 등수를 부여하고, 그다음 등수는 건너뜁니다. 예를 들어 공동 2등이 두 명이면 3등은 존재하지 않고 바로 4등으로 넘어갑니다.
풀이 아이디어
등수를 구하는 가장 직관적인 방법은 "나보다 점수가 높은 사람이 몇 명인가" 를 세는 것입니다. 나보다 점수가 높은 사람이 0명이면 1등, 2명이면 3등이 되는 식입니다. 이 방식을 쓰면 동점자 처리(공동 등수, 등수 건너뛰기)를 별도 로직 없이 자연스럽게 해결할 수 있다는 장점이 있습니다.
절차는 다음과 같습니다.
- 자기 자신을 포함한 전체 학생을 순회하면서, 나보다 점수 합(영어+수학)이 큰 학생 수를 셉니다.
- 1 + (나보다 점수 합이 큰 학생 수)가 그 학생의 등수가 됩니다.
두 학생을 비교할 때 각자의 합을 2로 나눈 값(평균)을 비교하나, 나누지 않은 합 그대로 비교하나 대소 관계는 똑같습니다. 그래서 굳이 평균을 구하지 않고 두 점수의 합만으로 바로 비교해도 결과는 동일합니다.
코드
class Solution {
public int[] solution(int[][] score) {
int[] answer = new int[score.length];
for(int i = 0; i < score.length; i++) {
int rank = 1;
for(int j = 0; j < score.length; j++) {
int myScore = score[i][0] + score[i][1];
int otherScore = score[j][0] + score[j][1];
if(myScore < otherScore) {
rank++;
}
}
answer[i] = rank;
}
return answer;
}
}
코드 동작 설명
- myScore: 현재 확인 중인 학생(i번째)의 영어 점수 + 수학 점수 합
- 내부 for 문에서 다른 모든 학생(j번째)의 점수 합(otherScore)과 비교
- myScore < otherScore, 즉 나보다 총점이 높은 학생을 발견할 때마다 rank를 1씩 증가
- 반복이 끝나면 rank에는 "나보다 총점이 높은 학생 수 + 1", 즉 최종 등수가 저장됨
- 평균이 아니라 합을 그대로 비교하므로 나눗셈 연산이 없어 코드가 한 줄 더 단순해짐
두 번째 입출력 예로 검증해보면, 점수 합은 각각 150, 150, 80, 190, 190, 200, 40입니다(2로 나누면 문제에서 제시한 평균 75, 75, 40, 95, 95, 100, 20과 대소 관계가 동일). 이 중 200점(6번째)은 자신보다 높은 합이 없으므로 1등, 190점 두 명(4, 5번째)은 200점 한 명만 자신보다 높으므로 공동 2등, 150점 두 명(1, 2번째)은 200점과 190점 두 명이 자신보다 높으므로 공동 4등이 됩니다. 문제에서 주어진 결과 [4, 4, 6, 2, 2, 1, 7]과 정확히 일치합니다.
마무리
이 문제는 "등수 = 나보다 잘한 사람 수 + 1"이라는 핵심 아이디어만 떠올리면 쉽게 풀리는 문제입니다. 동점자가 있을 때 등수를 어떻게 처리할지 헷갈리기 쉬운데, 이 방식을 쓰면 별도 분기 처리 없이도 공동 등수와 등수 건너뛰기가 자동으로 해결된다는 점이 포인트입니다. 또한 평균을 굳이 구하지 않고 두 점수의 합만으로 비교해도 결과가 같다는 점까지 알아두면, 비슷한 유형의 "등수/순위 매기기" 문제를 풀 때 코드를 한층 더 간결하게 쓸 수 있습니다.
'프로그래머스 > 레벨0' 카테고리의 다른 글
| [프로그래머스 코딩 기초 트레이닝] 문자 개수 세기 - Java 풀이 (0) | 2026.09.01 |
|---|