본문 바로가기
알고리즘/Samsung

SW 1983.조교의 성적 매기기

by son_i 2023. 4. 18.
728x90

상당히 간단하게 풀었다고 생각했는데 런타임 에러가 났다.

무작정 오류를 해결하려고 하기보단 근본적으로 돌아가서 생각해보자.

 

컴파일 에러 vs 런타임 에러

- 컴파일에러

컴파일시 발생

컴파일러는 구문 오류로 프로그램 컴파일 자체가 불가

대체로 문법상의 에러

에러가 발생한 부분을 알려준다.

ex) ; 누락, 괄호가 안 맞는 등, classpath에 누락된 클래스(컴파일 시)

 

- 런타임에러

실행 시 발생하는 에러

프로그램이 컴파일된 후 실행하면서 에러 발생

개발 시 설계 미숙(논리적)으로 발생하는 에러

에러 발생 시 개발자가 역추적해서 원인을 확인해야함.

ex) NullPointerException

      무한루프

      0으로 나누는 경우 등

 

그럼 나는 왜 났을까 

스택 오버플로우라고 하는데 .. 으음

input 케이스 10개를 다 넣어보니까 인덱스 에러 오류가 난다 

 

아 !! 학생수가 10명 이상일 때를고려 안 했구나 학생은 (N) 100명까지 가능 !

아 나 바본가 10번째 사람까지 쫙 A+ ~ D0까지 주고 11번째 사람을 A+을 줬네 ㅋㅋㅋㅋ

평점을 같은 비율로 분배 가능하다고 했으니 즉 10명이상일 때는 N/10명한테 동일한 학점을 부여가능.

N은 10의 배수니까 N/10 한 값만큼 동일한 학점을 받아야하니까

grade배열에서 학점을 뽑아올 때 인덱스를 [m/(N/10)]으로 줬다.

m은 정렬한 배열에서 내가 알고싶은 학생의 점수가 몇 번째 등수인지 값이고

N은 주어진 학생 명수

N이 30명일경우 12번째 학생이 17(m)번째 등수에 있었다고 치면

3명씩 같은 학점을 받아 내려올 거니까 grade인덱스에서는 grade[17/3] 5번째 학점인 B+ 을 받게된다

package algorithm;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

/*
   사용하는 클래스명이 Solution 이어야 하므로, 가급적 Solution.java 를 사용할 것을 권장합니다.
   이러한 상황에서도 동일하게 java Solution 명령으로 프로그램을 수행해볼 수 있습니다.
 */
public class Solution
{
	public static void main(String args[]) throws Exception
	{
		//System.setIn(new FileInputStream("C:\\so_Project\\workspace\\BaekJoon\\src\\algorithm\\input.txt"));

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		String grade[] = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0" }; //학점이 저장된 배열
		
		for(int i=1;i<=T;i++) { //테스트 케이스만큼 반복
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken()); //N명의 학생 중
			int K = Integer.parseInt(st.nextToken()); //K 번째의 학생 등수를 알고싶음
			Double arr[] = new Double[N]; //학생들의 평점을 저장할 배열
			int m;
			for(int j=0;j<N;j++) { //N명의 학생의 총점 배열에 저장
				st = new StringTokenizer(br.readLine());
				int middle = Integer.parseInt(st.nextToken());
				int finaltest = Integer.parseInt(st.nextToken());
				int work = Integer.parseInt(st.nextToken());
				
				arr[j] = middle*0.35 + finaltest*0.45+work*0.2;
			}
			double score = arr[K-1]; //K번째 학생의 점수를 score에 저장
			System.out.println(score);
			Arrays.sort(arr,Collections.reverseOrder()); //배열 정렬 내림차순
			for(m =0;m<N;m++) 
				System.out.println(arr[m]);
			for(m =0;m<N;m++) {
				if(arr[m] == score) {
					break;
				}
			}
			System.out.println("#"+i+" "+grade[m/(N/10)]);
		}
	}
}

참 여기서 arr을 왜 Object타입인 Double형으로 했느냐

Arrays.sort를 할 때 오름차순은 상관없는데 내림차순을 할 때 Collections.reverseOrder()을 사용하였다.

Collections는 기본적으로 Object를 상속한 클래스에 대해서 사용 가능한 인터페이스 이므로

String, Integer,Double등과 같은 Object타입의 배열을 사용해야 한다.

따라서 double로 하니까 오류가 나서 Double로 하였따 !

 

 

'알고리즘 > Samsung' 카테고리의 다른 글

SW 1948. 날짜 계산기  (0) 2023.05.02
SW 1961. 숫자 배열 회전  (0) 2023.04.27
SW 2001. 파리퇴치  (0) 2023.04.18
SW 2005. 파스칼의 삼각형  (0) 2023.04.14
SW 2007. 패턴 마디의 길이  (0) 2023.04.14