https://programmers.co.kr/learn/courses/30/lessons/83201
상호 평가로 학생들에게 점수를 부여한다.
자신에게 부여한 점수가 유일한 최고점 혹은 유일한 최저점일 경우 제외 시키고
그 외에는 모두 합산하여 평균을 구하고 문자열로 점수를 반환하시오.
class Solution {
public String solution(int[][] scores) {
String answer = "";
int row = scores.length;
int column = row;
int[] selfScores = new int[row];
float[] average = new float[column];
// 1. 자신에게 부여한 점수를 구하기 selfScore O(N^2)
// 2. self Score를 가지고 그 외 점수들과 비교 O(N^2)
// 3. 제외 혹은 합산
// 4. 평균
// 5. 평균을 가지고 점수로 치환
for(int i = 0; i < row; i++){
for(int j = 0; j < row; j++){
if(i == j) selfScores[i] = scores[i][j];
}
}
for(int idx = 0; idx < row; idx++) {
boolean max = false;
boolean min = false;
boolean equal = false;
int selfScore = selfScores[idx];
for(int secondIdx = 0; secondIdx < column; secondIdx++) {
int temp = scores[secondIdx][idx];
if(idx != secondIdx) {
if(selfScore > temp) max = true;
if(selfScore < temp) min = true;
if(selfScore == temp) equal = true;
average[idx] += temp;
}
}
if(max == true && min == true || equal == true) {
average[idx] += selfScore;
average[idx] /= row;
}else {
average[idx] /= (row - 1);
}
}
for(int idx = 0; idx < row; idx++) {
switch((int)average[idx] / 10){
case 10 : answer += "A"; break;
case 9 : answer += "A"; break;
case 8 : answer += "B"; break;
case 7 : answer += "C"; break;
case 6 : answer += "D"; break;
case 5 : answer += "D"; break;
default: answer += "F"; break;
}
}
return answer;
}
}
다른분 풀이
class Solution {
public String solution(int[][] scores) {
StringBuilder builder = new StringBuilder();
for(int i=0; i<scores.length; i++) {
int max = 0;
int min = 101;
int sum = 0;
int divide = scores.length;
for(int j=0; j<scores.length; j++) {
int score = scores[j][i];
if(i != j) {
if(score < min) {
min = score;
}
if(score > max) {
max = score;
}
}
sum += score;
}
if(scores[i][i] < min || scores[i][i] > max) {
sum -= scores[i][i];
divide--;
}
double score = (double) sum / divide;
builder.append(score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 50 ? "D" : "F" );
}
return builder.toString();
}
}
StringBuilder 및 중첩 삼항식 적용
class Solution {
public String solution(int[][] scores) {
StringBuilder builder = new StringBuilder();
int row = scores.length;
int column = row;
boolean maxScore = true;
boolean minScore = true;
int[] selfScores = new int[row];
float[] average = new float[column];
// 1. 자신에게 부여한 점수를 구하기 selfScore O(N^2)
// 2. self Score를 가지고 그 외 점수들과 비교 O(N^2)
// 3. 제외 혹은 합산
// 4. 평균
// 5. 평균을 가지고 점수로 치환
for(int i = 0; i < row; i++){
for(int j = 0; j < row; j++){
if(i == j) selfScores[i] = scores[i][j];
}
}
for(int idx = 0; idx < row; idx++) {
boolean max = false;
boolean min = false;
boolean equal = false;
int selfScore = selfScores[idx];
for(int secondIdx = 0; secondIdx < column; secondIdx++) {
int temp = scores[secondIdx][idx];
if(idx != secondIdx) {
if(selfScore > temp) max = true;
if(selfScore < temp) min = true;
if(selfScore == temp) equal = true;
average[idx] += temp;
}
}
if(max == true && min == true || equal == true) {
average[idx] += selfScore;
average[idx] /= row;
}else {
average[idx] /= (row - 1);
}
}
for(int idx = 0; idx < row; idx++) {
float score = average[idx];
builder.append(score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 50 ? "D" : "F" );
}
return builder.toString();
}
}
StringBuilder쓰니 연산속도가 역시 빠르다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
가장 가까운 같은 글자 (0) | 2023.02.28 |
---|---|
[프로그래머스] 부족한 금액 계산하기 (0) | 2021.08.11 |
[프로그래머스] - 로또의 최고 순위와 최저 순위 (0) | 2021.07.21 |
[프로그래머스] - [1차] 추석 트래픽 (0) | 2021.04.07 |
[프로그래머스] - 타겟 넘버 (0) | 2021.04.06 |