등수 매기기
문제
- 2차원 정수 배열 score가 매개변수로 주어집니다.
- 영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다.
- 영어 점수와 수학 점수를 담은 score가 주어질 때,
- 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 출력하는 문제입니다.
테스트 (인텔리제이)
- 우선 평균을 저장할 avg 배열을 생성합니다. 여기서 avg를 double 배열로 선언한 이유는 평균 값에 소수점이 나올 수 있기 때문입니다.
- 이후 for문으로 score의 크기 만큼 반복하도록 설정하고
- avg에 score의 각 원소의 첫 번째 원소와 두 번째 원소를 더하고 그 값의 2.0을 나눈 몫을 저장하도록 합니다.
- 이제 각 점수의 평균을 저장하고 있는 avg의 값을 하나씩 꺼내기 위해 반복 횟수 i와 함께 또 다른 for문을 생성하고 등수를 나타내는 rank를 선언합니다. 여기서 rank는 for문이 한 번 반복을 끝내면 1이 될 수 있게 1로 초기화 해줍니다.
- 중첩 for문으로 avg의 각 원소의 등수를 확인하기 위해 반복 횟수 j와 함께 또 다른 for문을 avg의 크기만큼 반복하도록 설정해줍니다.
- 이후 if문으로 avg i번째 원소를 avg j의 원소들과 비교하여 i 번째 원소가 더 작을 경우 rank를 1씩 증가하게 하여
- 마지막에 answer에 rank를 담도록 하면 해결할 수 있습니다.
package com.example.codingtest;
import java.util.Arrays;
public class 등수_매기기 {
public static void main(String[] args) {
/*
2차원 정수 배열 score가 매개변수로 주어집니다.
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다.
영어 점수와 수학 점수를 담은 score가 주어질 때,
영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 출력하는 문제입니다.
제한사항
- 0 ≤ score[0], score[1] ≤ 100
- 1 ≤ score의 길이 ≤ 10
- score의 원소 길이는 2입니다.
- score는 중복된 원소를 갖지 않습니다.
입출력 예
score
[[80, 70], [90, 50], [40, 70], [50, 80]]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]]
[[1, 3], [3, 1], [2, 3], [3, 2], [1, 2], [1, 1]]
result
[1, 2, 4, 3]
[4, 4, 6, 2, 2, 1, 7]
[3, 3, 1, 1, 5, 6]
입출력 설명
#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등은 없습니다.
*/
int[][] score = {{1, 3}, {3, 1}, {2, 3}, {3, 2}, {1, 2}, {1, 1}};
double[] avg = new double[score.length];
int[] answer = new int[score.length];
for (int i = 0; i < score.length; i++) {
avg[i] = (double) (score[i][0] + score[i][1]) / 2.0;
}
for (int i = 0; i < avg.length; i++) {
int rank = 1;
for (int j = 0; j < avg.length; j++) {
if (avg[i] < avg[j]) {
rank++;
}
}
answer[i] = rank;
}
System.out.println(Arrays.toString(answer));
}
}
프로그래머스 코드
import java.util.*;
class Solution {
public int[] solution(int[][] score) {
double[] avg = new double[score.length];
int[] answer = new int[score.length];
for (int i = 0; i < score.length; i++) {
avg[i] = (double) (score[i][0] + score[i][1]) / 2.0;
}
for (int i = 0; i < avg.length; i++) {
int rank = 1;
for (int j = 0; j < avg.length; j++) {
if (avg[i] < avg[j]) {
rank++;
}
}
answer[i] = rank;
}
return answer;
}
}