프로그래머스 위클리 챌린지 2주차
2021. 9. 1. 15:58ㆍCodingTest
문제
https://programmers.co.kr/learn/courses/30/lessons/83201
문제요약
- 각각의 학생들에게 평가받은 점수의 평균을 구하여 기준에 따라서 학점을 부여합니다.
- 단, 자기 자신을 평가한 점수가 유일한 최고점이거나 유일한 최저점인 경우 그 점수는 평균 계산에서 제외합니다.
- 자기 자신을 평가한 점수가 최고점이거나 최저점이지만 유일하지 않는다면 그 점수는 평균 계산에 포함됩니다.
문제해결 방법
1. 입력받은 이차원 점수 배열표는 다음과 같습니다.
- 첫번째 인덱스(열) : N번째 학생이 평가받은 점수집합
- 두번째 인덱스(행) : N번째 학생이 평가한 점수집합
핵심은 각각의 열의 최고점 또는 최저점을 탐색합니다.
2. 탐색한 최고점 또는 최저점수와 N번째 학생의 스스로를 평가한 점수와 비교합니다.
- 같은 경우 => 해당 점수가 N번째 학생의 평가된 점수집합에서 2개 이상 존재하는지 재탐색을 수행
- 유일한 경우 => 평균 계산시 제외
- 중복되는 경우 => 평균 계산시 포함
- 다른 경우 => 평균 계산시 포함
3. 기준에 따른 학점을 부여
- 90점 이상 => A
- 80점 이상 90점 미만 => B
- 70점 이상 80점 미만 => C
- 50점 이상 70점 미만 => D
- 50점 미만 => F
소스코드
public class Solution{
public static String getGrade(int score)
{
if(score>=90 && score<=100)
{
return "A";
}
else if(score>=80 && score<90)
{
return "B";
}
else if(score>=70 && score<80)
{
return "C";
}
else if(score>=50 && score<70)
{
return "D";
}
else
{
return "F";
}
}
// i번째 열 학생의 평가받은 점수집합의 평균을 게산
// flag : true=>(i,i)번째 (자기평가점수 제외) 점수를 평균 계산에서 제외
public static int getAverage(int[][] scores, int i, boolean flag)
{
int sum =0;
int n = scores.length;
for(int j=0;j<scores.length;j++)
{
if(flag && j==i)
{
n--;
continue;
}
else
{
sum += scores[j][i];
}
}
return sum / n;
}
// 해당 점수가 N번째 학생의 평가받은 점수집합에서 2개이상 존재하는지 재탐색
// scores : 2차원 점수 배열
// i : i번째 열
public static boolean isDuplicateNumber(int[][] scores, int i)
{
int count = 0;
for(int j=0;j<scores[i].length;j++)
{
if(scores[j][i]==scores[i][i])
{
count++;
}
}
return (count>=2 ? true : false);
}
// scores 첫번째 인덱스 (열) : N번째 학생이 평가된 점수집합
// scores 두번째 인덱스 (행) : N번째 학생이 평가한 점수집합
public static String solution(int[][] scores) {
String answer = "";
for(int i=0;i<scores.length;i++)
{
// 0 <= score <= 100 이므로 최고점=-1, 최저점=101 초기화
int maxVal = -1;
int minVal = 101;
// N번째 학생이 평가받은 점수집합에서 최고점과 최저점을 구함
for(int j=0;j<scores[i].length;j++)
{
if(scores[j][i]>maxVal)
{
maxVal = scores[j][i];
}
if(scores[j][i]<minVal)
{
minVal = scores[j][i];
}
}
// i번째 학생이 자기를 평가한 점수가 최고점이거나 최저점인지 검사한다.
if(scores[i][i]==maxVal || scores[i][i]==minVal)
{
if(isDuplicateNumber(scores, i)) // 최고점 또는 최저점이나 중복됨
{
answer += getGrade(getAverage(scores, i,false));
}
else // 최고점 또는 최저점이자 유일함
{
answer += getGrade(getAverage(scores, i,true));
}
}else // 최고점 또는 최저점이 아님
{
answer += getGrade(getAverage(scores, i,false));
}
}
return answer;
}
}
References
프로그래머스 위클리 챌린지 2주차 : https://sumin-yang.tistory.com/21
'CodingTest' 카테고리의 다른 글
백준 11726, 2 x n 타일링 (0) | 2021.09.06 |
---|---|
프로그래머스 위클리 챌린지 4주차 (0) | 2021.09.02 |
백준 10987, 모음의 개수 (0) | 2021.08.16 |
백준(Backjoon) 9625, BABBA (0) | 2021.07.23 |
백준(Backjoon) 9093, 단어 뒤집기 (0) | 2021.07.22 |