문제
풀이
대학교 때 흔히 접한 조별과제 조별 인원 평가 점수를 가지고, 교수님의 입장에서 점수 계산을 한다.
조건 1. 내가 평가한 나의 점수가 최고점 또는 최저점이면 나의 점수는 제외하고 평균 점수를 계산한다.
조건 2. 하지만 나의 점수가 유일하지 않다면(동일한 점수가 또 있다면) 평균 점수 계산에서 제외하지 않는다.
중요한 요구조건은 이 두 가지다.
평균점수를 계산해야 하기 때문에 scores 2차원 배열을 모두 1번씩은 순회해야 하는 것은 필수다.
딱 1번씩만 순회하도록 하는 게 가장 빠른 시간일 것이다.
최고/최소 점수 여부, 유일성 여부는 평가받은 점수를 가지고 검사해야 한다.
한 사이클에 1인의 평균 점수(제외 여부 포함)를 구하고 치우는 것이 temp memory를 적게 사용할 것이다.
ex) 0의 평균 점수 계산 -> 1의 평균 점수 계산 -> 끝까지
그러려면 column 기준으로 순회를 한다. 비공식 column 인덱스인 j를 이용해서 순회한다.
column 한 번에서 발생된 내용은 다른 column에서는 알 필요가 없다.
한 사이클 안에서 isHighestScore(내 점수가 최대 점수인가?), isLowestScore(내 점수가 최소 점수인가?), isSameScore(동일한 점수가 또 있는가?) flag들을 얻는다.
이후 세 가지 조건을 조합해서 총점수와 평균의 분모를 결정한다.
그리고 그 점수를 scoreToRank 함수로 문자로 변환하면 된다.
평균점수를 학점으로 변경하는 것은 알고리즘과는 별개이기 때문에 함수로 구현했다. (scoreToRank)
소스코드
Java
class Solution {
public String solution(int[][] scores) {
StringBuffer sb = new StringBuffer();
int N = scores.length;
for(int j=0; j< N; j++) {
int myScore = scores[j][j];
double myTotalScore = 0;
boolean isHighestScore = true;
boolean isLowestScore = true;
boolean isSameScore = false;
for(int i=0; i < N; i++) {
myTotalScore += scores[i][j];
if(myScore > scores[i][j]){
isHighestScore = false;
}
if(myScore < scores[i][j]){
isLowestScore = false;
}
if(i != j && myScore == scores[i][j]) {
isSameScore = true;
}
}
int studentCnt = N;
if(!isSameScore && (isHighestScore || isLowestScore)) {
myTotalScore -= myScore;
studentCnt--;
}
sb.append(scoreToRank(myTotalScore/studentCnt));
}
return sb.toString();
}
public char scoreToRank(double score) {
if(score >= (double) 90)
return 'A';
if(score >= (double) 80)
return 'B';
if(score >= (double) 70)
return 'C';
if(score >= (double) 50)
return 'D';
return 'F';
}
}
'CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 7주차 - 입실 퇴실 (0) | 2021.09.15 |
---|---|
[프로그래머스] 위클리 챌린지 6주차 - 복서 정렬하기 (0) | 2021.09.14 |
[BOJ] 5430번 : AC - Java (0) | 2021.08.16 |
[프로그래머스] 카카오프렌즈 컬리링북 (0) | 2021.08.11 |
[프로그래머스] 위클리 챌린지 1주차 - 상호 평가 (0) | 2021.08.09 |