본문 바로가기

SWEA/D2

[SWEA 1983][D2][JAVA] 조교의 성적 매기기

[문제]

 

https://swexpertacademy.com/main/code/problem/problemSolver.do

 

SW Expert Academy

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

www.swexpertacademy.com

[풀이방법]

 

중간(35%) / 기말(45%) / 과제 (20%) 비율을 계산해서 계산 결과를 Double 형 변수에 저장합니다. 

 

학점을 알고 싶은 학생의 번호를 찾아가는 것이기 때문에 본래 받은 순서(출석 번호라고 간주)를 유지할 필요가 있습니다.

하지만 소팅을 해야 학점을 매길 수 있기 때문에 여기서 hashmap을 사용했습니다. 

 

HashMap<Integer, Double> 을 사용해서 학생의 번호와 계산한 결과값을 넣은 후 스태틱 메소드를 사용해서 소트해줍니다. 

 

소트한 결과를 살펴보면서 HashMap의 키 값과 우리가 찾는 학생의 번호가 일치하면 소트한 순서를 살펴보면서 학점을 구합니다. 

 

학점 비율로 계산한 결과

74.6 92.55 88.8 99.45 72.35 85.85 96.25 68.95 85.75 85.5
  A-   A+     A0      

HashMap을 사용해서 내림차순 한 결과

 

(출석번호..?를 유지합니다)

4 7 2 3 6 10 9 1 5 8
99.45 96.25 92.55 88.8 85.85 85.75 85.5 74.6 72.35 68.95
A+ A0 A-              

 

빨간색으로 처리된 번호는 우리가 찾는 번호입니다. 

학점은 N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여할 수 있기 때문에 N/10을 unit으로 두고 내림차순으로 정렬된 순서 / unit으로 계산하면 알맞는 학점을 구할 수 있습니다. 

 

복잡해보일 수 있지만 HashMap을 사용할 수 있다면 어렵지 않게 해결 할 수 있습니다.

 


        String[] grade = { "A+""A0""A-""B+""B0""B-""C+""C0""C-""D0"};

        

        for (int k = 0; k < T; k++) {

            sf.append("#" + (k+1+ " ");

            st = new StringTokenizer(br.readLine());

            

            int N = Integer.parseInt(st.nextToken()); //학생 수 

            int K = Integer.parseInt(st.nextToken()); // 학점을 알고 싶은 학생의 번호 

            

            

            int unit = N /10;

            

            HashMap<Integer, Double> hash = new HashMap<>();

            

            for (int i = 1; i <= N; i++) {

                st = new StringTokenizer(br.readLine());

                

                int mid = Integer.parseInt(st.nextToken());

                int fi_ex = Integer.parseInt(st.nextToken());

                int hw = Integer.parseInt(st.nextToken());

                

                Double result = 0.0;

                

                result += mid * 0.35;

                result += fi_ex * 0.45;

                result += hw * 0.20;

                

                hash.put(i, result);

                

            }

            

            Iterator it = sortHash(hash).iterator();

            

            int j = 0;

            while(it.hasNext()) {

                int temp = (int) it.next();

                

                if (K == temp) {

                    sf.append(grade[j / unit ] + "\n");

                    break;

                }

                j++;

            }

        }

        System.out.println(sf.toString());

    }

    static List<Integer> sortHash(final HashMap<Integer, Double> map) {

        List<Integer> list = new ArrayList<>();

        

        list.addAll(map.keySet());

        

        Collections.sort(list, new Comparator<Object>() {

 

            @Override

            public int compare(Object o1, Object o2) {

                // TODO Auto-generated method stub

                Object v1 = map.get(o1);

                Object v2 = map.get(o2);

                

                return ((Comparable<Object>) v1).compareTo(v2);

            }

            

        });

        

        Collections.reverse(list);

        

        return list;

    }