본문 바로가기

Java/Java 알고리즘 SWEA

[SW 아카데미] 1983. 조교의 성적 매기기

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PwGK6AcIDFAUq&categoryId=AV5PwGK6AcIDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=2&pageSize=30&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. 객체로 저장하기

2. 성적 총점순으로 정렬 후, 성적비율만큼 성적 매기기

3. 학생 번호순으로 정렬해, 원하는 학생 성적 출력

 

주의사항

: 총점이 소수점으로 나오기 때문에 Comparator 오버라이딩시

 

(int)형으로 형변환하는게 아니라 직접 순서를 정해준다.

Collections.sort(list, new Comparator<Grade>() {
    @Override
    public int compare(Grade o1, Grade o2) {
        if(o2.total>o1.total)
            return 1;
        else
            return -1;
    }
});

 

 

package sw1983;

/////////////////////////////////////////////////////////////////////////////////////////////
// 기본 제공코드는 임의 수정해도 관계 없습니다. 단, 입출력 포맷 주의
// 아래 표준 입출력 예제 필요시 참고하세요.
// 표준 입력 예제
// int a;
// double b;
// char g;
// String var;
// long AB;
// a = sc.nextInt();                           // int 변수 1개 입력받는 예제
// b = sc.nextDouble();                        // double 변수 1개 입력받는 예제
// g = sc.nextByte();                          // char 변수 1개 입력받는 예제
// var = sc.next();                            // 문자열 1개 입력받는 예제
// AB = sc.nextLong();                         // long 변수 1개 입력받는 예제
/////////////////////////////////////////////////////////////////////////////////////////////
// 표준 출력 예제
// int a = 0;
// double b = 1.0;
// char g = 'b';
// String var = "ABCDEFG";
// long AB = 12345678901234567L;
//System.out.println(a);                       // int 변수 1개 출력하는 예제
//System.out.println(b);                                 // double 변수 1개 출력하는 예제
//System.out.println(g);                                 // char 변수 1개 출력하는 예제
//System.out.println(var);                           // 문자열 1개 출력하는 예제
//System.out.println(AB);                              // long 변수 1개 출력하는 예제
/////////////////////////////////////////////////////////////////////////////////////////////
import java.util.*;
import java.io.FileInputStream;

/*
   사용하는 클래스명이 Solution 이어야 하므로, 가급적 Solution.java 를 사용할 것을 권장합니다.
   이러한 상황에서도 동일하게 java Solution 명령으로 프로그램을 수행해볼 수 있습니다.
 */
class Grade{
    public int num, mid, end, sub;
    public double total;
    public String score;
    public Grade(int num, int mid, int end, int sub){
        this.num=num;
        this.mid=mid;
        this.end=end;
        this.sub=sub;
    }

}
class Solution
{
    public static void main(String args[]) throws Exception
    {
      /*
         아래의 메소드 호출은 앞으로 표준 입력(키보드) 대신 input.txt 파일로부터 읽어오겠다는 의미의 코드입니다.
         여러분이 작성한 코드를 테스트 할 때, 편의를 위해서 input.txt에 입력을 저장한 후,
         이 코드를 프로그램의 처음 부분에 추가하면 이후 입력을 수행할 때 표준 입력 대신 파일로부터 입력을 받아올 수 있습니다.
         따라서 테스트를 수행할 때에는 아래 주석을 지우고 이 메소드를 사용하셔도 좋습니다.
         단, 채점을 위해 코드를 제출하실 때에는 반드시 이 메소드를 지우거나 주석 처리 하셔야 합니다.
       */
        System.setIn(new FileInputStream("src/sw1983/input.txt"));

      /*
         표준입력 System.in 으로부터 스캐너를 만들어 데이터를 읽어옵니다.
       */
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();
      /*
         여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
      */

        for(int test_case = 1; test_case <= T; test_case++)
        {
            ArrayList<Grade> list = new ArrayList<>();
            int N=sc.nextInt();
            int K=sc.nextInt();
            for(int i=0;i<N;i++){
                Grade grade = new Grade(i, sc.nextInt(), sc.nextInt(), sc.nextInt());
                grade.total=grade.mid*0.35+grade.end*0.45+grade.sub*0.2;
                list.add(grade);
                //System.out.println(grade.total);
            }
            //System.out.println();
            //10개의 평점 -> 같은 비율로 -> 10개 평점 10명 학생 -> 1명에게 한 평점
            String[] gradelist = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0"};
            int graderatio= N/gradelist.length;
            Collections.sort(list, new Comparator<Grade>() {
                @Override
                public int compare(Grade o1, Grade o2) {
                    if(o2.total>o1.total)
                        return 1;
                    else
                        return -1;
                }
            });

                for (int i=0;i<list.size();) {
                    for(String str : gradelist) {
                        for(int j=0;j<graderatio;j++) {
                            if(i<list.size()) {
                                list.get(i).score = str;
                                i++;
                            }
                        }
                }
            }
//            for(Grade grade:list) System.out.println(grade.num+" "+grade.total+" "+grade.score);

            Collections.sort(list, new Comparator<Grade>() {
                    @Override
                    public int compare(Grade o1, Grade o2) {
                        return o1.num-o2.num;
                    }
                });
            System.out.println("#"+test_case+" "+list.get(K-1).score);






            /////////////////////////////////////////////////////////////////////////////////////////////
         /*
             이 부분에 여러분의 알고리즘 구현이 들어갑니다.
          */
            /////////////////////////////////////////////////////////////////////////////////////////////

        }
    }
}

 

반응형