Algorithm/프로그래머스
[프로그래머스] 상호 평가
JunGi Jeong
2021. 8. 11. 14:09
https://programmers.co.kr/learn/courses/30/lessons/83201
코딩테스트 연습 - 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
상호 평가로 학생들에게 점수를 부여한다.
자신에게 부여한 점수가 유일한 최고점 혹은 유일한 최저점일 경우 제외 시키고
그 외에는 모두 합산하여 평균을 구하고 문자열로 점수를 반환하시오.
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쓰니 연산속도가 역시 빠르다.