프로그래머스 위클리 챌린지 2주차

2021. 9. 1. 15:58CodingTest

문제

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

 

 

문제요약

  1. 각각의 학생들에게 평가받은 점수의 평균을 구하여 기준에 따라서 학점을 부여합니다.
  2. 단, 자기 자신을 평가한 점수가 유일한 최고점이거나 유일한 최저점인 경우 그 점수는 평균 계산에서 제외합니다.
  3. 자기 자신을 평가한 점수가 최고점이거나 최저점이지만 유일하지 않는다면 그 점수는 평균 계산에 포함됩니다.

 

문제해결 방법

1. 입력받은 이차원 점수 배열표는 다음과 같습니다.

  1. 첫번째 인덱스(열) : N번째 학생이 평가받은 점수집합
  2. 두번째 인덱스(행) : N번째 학생이 평가한 점수집합

핵심은 각각의 열의 최고점 또는 최저점을 탐색합니다.

 

2. 탐색한 최고점 또는 최저점수와 N번째 학생의 스스로를 평가한 점수와 비교합니다.

  1. 같은 경우 => 해당 점수가 N번째 학생의 평가된 점수집합에서 2개 이상 존재하는지 재탐색을 수행
    1. 유일한 경우 => 평균 계산시 제외
    2. 중복되는 경우 => 평균 계산시 포함
  2. 다른 경우 => 평균 계산시 포함

3. 기준에 따른 학점을 부여

  1. 90점 이상 => A
  2. 80점 이상 90점 미만 => B
  3. 70점 이상 80점 미만 => C
  4. 50점 이상 70점 미만 => D
  5. 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