상당히 간단하게 풀었다고 생각했는데 런타임 에러가 났다.
무작정 오류를 해결하려고 하기보단 근본적으로 돌아가서 생각해보자.
컴파일 에러 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 |