본문으로 바로가기

code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.util.Scanner;
import java.util.ArrayList;
 
 
public class StudentDemo {
    public static void main(String args[]) {
        StudentDemo program = new StudentDemo();
        program.doit();
    }
    void doit() {
        ArrayList<Student> member = new ArrayList<Student>();
        while (true) {
            member.add(new Student());
            member.get(member.size()-1).setInfo();
            if (member.get(member.size()-1).name.equals("end")) break;
        }
        int max = member.size();
        for (int i=0; i<max-1; i++) member.get(i).process();
        for (int i=0; i<max-1; i++) member.get(i).printResult();
        member.get(0).printRanker();
        
    }
}
class Student{
    String name;
    int grade, min=100, max=0;
    double average;
    static String bestName;
    static double bestAverage;
    static ArrayList<String> greatArray = new ArrayList<String>();
    ArrayList<Integer> scoreArray = new ArrayList<Integer>();
    void setInfo() {
        Scanner sc = new Scanner(System.in);
        name = sc.next();
        if (name.equals("end"))    return;
        grade = sc.nextInt();
        do scoreArray.add(sc.nextInt());
        while (scoreArray.get(scoreArray.size()-1)!=0);
        scoreArray.remove(scoreArray.size()-1);
    }
    void process(){
        for (int i=0; i<scoreArray.size(); i++){
            if (min > scoreArray.get(i)){
                min = scoreArray.get(i);
            }
            if(max < scoreArray.get(i)){
                max = scoreArray.get(i);
            }
            average += scoreArray.get(i);
        }
        average = (average-min-max)/(scoreArray.size()-2);
        if (bestAverage < average){
            bestName=name;
            bestAverage = average;
        }
        if (min >= 10 && max >= 45) greatArray.add(name);
    }
    void printResult(){
        System.out.printf("%s(%d학년) [%.2f] ",name,grade,average);
        for (int i=0; i<scoreArray.size(); i++System.out.printf("%d ",scoreArray.get(i));
        System.out.printf("(%d %d 제외 %d개)\n",min,max,scoreArray.size()-2);
    }
    void printRanker(){
        System.out.printf("1등 : %s\n우수선수 %d명 - ",bestName,greatArray.size());
        for (int i=0; i<greatArray.size(); i++System.out.printf("%s ",greatArray.get(i));
    }
}
cs




부족한 점


- Student 클래스는 학생의 입장이기 때문에 1등 선별과 같은 기능이 있는것이 아쉽다. 이러한 기능은 main에서 지원해주어야 하기 때문에 학생 평균 점수를 반환해주는 기능만 구현했으면 좋을 것 같다.

- 배열 요소를 for문으로 접근할 때, i=0 ~ i<max 와 같은 형식이 아닌 int i : max 형식을 이용하여 구현했으면 더욱 바람직 했을 것 같다.

- 기본자료형의 경우 ArrayList 사용으로 속도적 측면에서 저하(래핑과 언래핑, 힙 객체에 접근하고 순차적이지 않기 때문에 os를 귀찮게함)될 가능성이 있다. 이러한 기본자료형의 ArrayList는 상황에 맞게 사용하는것이 좋다.