728x90
반응형
[문제4] 총점으로 전교등수를 계산하고 총점이 높은 순에서 낮은 순(내림차순)으로 정렬해서 list를 출력하세요.
전교등수를 저장할 수 있도록 Student클래스에 인스턴스변수 schoolRank가 추가되어 있습니다.
- calculateSchoolRank(List<Student> list) - 전교등수(schoolRank)를 계산한다.
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
package testAl;
import java.util.*;
class SungJukEx4 {
public static void main(String[] args) {
ArrayList<Student4> list = new ArrayList<Student4>();
// 이름, 반, 번호, 국어, 수학, 영어
list.add(new Student4("남궁성", 3,2,100,100,100));
list.add(new Student4("왕자바", 3,1,90,100,80));
list.add(new Student4("자바왕", 3,3,70,100,100));
list.add(new Student4("킹왕짱", 1,2,100,60,90));
list.add(new Student4("자바짱", 1,1,100,100,100));
list.add(new Student4("최고수", 1,3,100,80,60));
list.add(new Student4("홍길동", 2,1,50,80,100));
list.add(new Student4("일지매", 2,3,70,80,100));
list.add(new Student4("변강쇠", 2,4,80,80,85));
list.add(new Student4("이원구", 2,2,90,90,90));
calculateSchoolRank(list); // 전교등수를 계산한다.
printList(list);
}
public static void printList(List<Student4> list) {
System.out.println("이름\t반\t번호\t국어\t수학\t영어\t총점\t전교등수 ");
System.out.println("=================================================================");
for(Student4 s : list) {
System.out.println(s);
}
System.out.println("=================================================================");
}
public static void calculateSchoolRank(List<Student4> list) {
Collections.sort(list); // 먼저 list를 총점기준 내림차순으로 정렬한다.
int prevRank = -1; // 이전 전교등수
int prevTotal = -1; // 이전 총점
int length = list.size();
/* list가 이미 총점순으로 정렬되어 있기 때문에... 이전 데이터하고만 총점을 비교하면 된다.
다음의 코드를 완성하세요.
1. 반복문을 이용해서 list에 저장된 Student4객체를 하나씩 읽는다.
1.1 총점(total)이 이전총점(prevTotal)과 같으면
등수(prevRank)를 등수(schoolRank)로 한다.
1.2 총점이 서로 다르면,
등수(schoolRank)의 값을 알맞게 계산해서 저장한다.
이전에 동점자 였다면, 그 다음 등수는 동점자의 수를
고려해서 계산되어야한다.
(실행결과 화면 참고)
1.3 현재 총점과 등수를 이전총점(prevTotal)과 이전등수(prevRank)에 저장한다.
*/
for(int i = 1; i < length; i++ ) {
if(list.get(i).total == list.get(i - 1).total) {
if(i == 1) {
prevRank = list.get(i - 1).schoolRank + 1; // -1을 1로 만들기
}
list.get(i - 1).schoolRank = prevRank;
list.get(i).schoolRank = prevRank;
}else {
prevRank = i + 1;
list.get(i).schoolRank = prevRank;
}
}
} // public static void calculateSchoolRank(List<Student4> list) {
}
class Student4 implements Comparable<Student4> {
String name = "";
int classNo = 0;
int StudentNo = 0;
int koreanScore = 0;
int mathScore = 0;
int englishScore = 0;
int total = 0;
int schoolRank = 0; // 전교등수
Student4(String name, int classNo, int Student4No, int koreanScore, int mathScore, int englishScore) {
this.name = name;
this.classNo = classNo;
this.StudentNo = Student4No;
this.koreanScore = koreanScore;
this.mathScore = mathScore;
this.englishScore = englishScore;
total = koreanScore + mathScore + englishScore;
}
public String toString() {
return name + "\t"
+ classNo + "\t"
+ StudentNo + "\t"
+ koreanScore + "\t"
+ mathScore + "\t"
+ englishScore + "\t"
+ total + "\t"
+ schoolRank + "\t";
}
public int compareTo(Student4 obj) {
return obj.total - this.total;
// return this.name.compareTo(obj.name); // 이름기준으로 오름차순 정렬
}
/* 제네릭스(Generics) 사용하지 않은 버젼
public int compareTo(Object obj) {
int result = -1;
if(obj instanceof Student4) {
Student4 tmp = (Student4)obj;
result = tmp.total - this.total;
}
return result;
}
*/
} // end of class Student4
class ClassTotalComparator1 implements Comparator<Student4> {
public int compare(Student4 s1, Student4 s2) {
int result = s1.classNo - s2.classNo;
if(result==0)
result = s2.total - s1.total;
return result;
}
}
class ClassStudent4NoComparator implements Comparator<Student4> {
public int compare(Student4 s1, Student4 s2) {
int result = s1.classNo - s2.classNo;
if(result==0)
result = s1.StudentNo - s2.StudentNo;
return result;
}
}
|
[출력 결과]
728x90
반응형
'알고리즘 > 남궁성 자바 1000제' 카테고리의 다른 글
[Java1000제] 성적처리 3 - Comparator를 이용한 정렬 (0) | 2021.02.12 |
---|---|
[Java1000제] 성적처리 2 - Comparable구현하기 (0) | 2021.02.07 |
[Java1000제] 성적처리 1 - Student클래스 만들기 (0) | 2021.02.06 |