Scanner를 이용해 각 학생의 점수를 입력받고 각 학생별 과목 성적 평균, 각 과목별 학생 성적 평균을 계산하고,
과목별 학생 평균 성적을 내림차순으로 정렬하고, 과목 이름을 함꼐 출력하고, 각 학생별 과목 성적 평균을 오름차순으로 정렬하고, 각 학생 번호도 출력해보자.
내가 출력하고자 하는 데이터는 이렇다

Scanner sc = new Scanner(System.in);
System.out.println("학생수를 입력하세요");
int student = sc.nextInt();
System.out.println("과목수를 입력하세요");
int sub = sc.nextInt();
int[][] arr = new int[student][sub];
for(int i =0; i<student;i++){
System.out.println(i+1+"번째 학생의");
for (int j =0; j<sub;j++){
System.out.println(j+1+"번 과목 성적을 입력하세요");
arr[i][j] = sc.nextInt();
}
}
학생수와 과목의 수를 입력 받고자 할때 그 학생의 번호와 n번째 과목의 성적을 arr[][] 2차원 배열에 넣어보았다.
int[1][1] == 첫번째 학생의 첫번째 과목점수, int[2][3] == 두번째 학생의 세번째 과목점수. 이런식으로 배열에 저장해 보았다.
scanner를 이용하지 않고 그냥 받고싶을경우
// int[][] arr = {{50, 60, 70}, {60, 76, 100}, {95, 88, 87}, {60, 65, 85}, {100, 85, 77}};
// 입력하기 귀찮을때 예제
예제를 준비했다.
이제 입력받은 학생과 과목의 성적이 담긴 배열을 가지고 학생별 평균과 과목별 평균을 구해보자.
double[] subavr = new double[sub];
double[] stdavr = new double[student];
for (int i = 0; i<student;i++){
double score = 0;
for(int j = 0; j <sub;j++){
score += arr[i][j];
}
stdavr[i]=score/sub;
}
for (int j = 0; j < sub; j++){
double score = 0;
for(int i =0; i <student;i++){
score+= arr[i][j];
}
subavr[j]=score/student;
}
subavr 와 stdavr라는 배열을 새로 만들었다.
과목별 성적 평균과 각 학생별 평균을 담을 배열이야.
2중 반복문을 통해 score에 학생의 과목별 점수를 모두 담아 과목수로 score을 나눈 뒤 stdavr에 넣고 score를 초기화를시켰다.
이 과정을 통해 1번 학생부터 5번학생까지의 성적을 stdavr에 담았다.
stdavr == (60,78.8,90,70,87.3)
subavr도 같은 2중반복문을 통해 subavr라는 배열에 각 과목별 점수의 합을 학생수로 나누고 subavr에 집어넣었다.
subavr == (73,74.8,83.8)
이제 각 학생의 평균 점수와 과목별 학생평균점수를 이용해 순서를 나열해보자.
double[] std = new double[student];
for (int i = 0; i < stdavr.length; i++) {
std[i] = stdavr[i];
}
if문을 통해 배열에서의 순서를 바꾸게되면 학생의 번호는 저장하지 않고 학생의 순서로만 저장했던 stdavr에 의해 학생의 번호를 잃어버리기 때문에 std[] 배열을 새로 만들어 반복문을 통해 stdavr의 값을 넣어준다.
여기서 그냥 std[i] = stdavr[i]를 하게되면 주소값까지 같아져서 stdavr의 값이 변경될떄 std도 같이 변경되기 떄문에 for문을 통해 일일이 넣어줘야 한다.
Arrays.sort(std);
int bestStd=0;
for(int i =0; i<student; i++){
for(int k=0; k<student;k++){
if(std[student-i-1]==stdavr[k]){
bestStd = k+1;
}
}
System.out.printf(i+1+"등 학생의 번호는 "+bestStd+"번 이고, 평균 점수는 "+stdavr[bestStd-1]+"점 입니다.");
System.out.println();
}
Array.sort(std); 를 통해 각 학생의 성적을 내림차순으로 정렬한다.
int형 bestStd(최고점수 학생) 을 만들고
가장 높은 점수부터 원래의 학생 번호가 그대로 있는 배열과 비교를 해보고 번호를 출력한다.
이때 i가 0부터 시작이기 떄문에 학생 번호를 가시성 좋게 표현하려면 1번부터 시작하는게 좋기떄문에 +1을 해주었다.
과목별 순위도 같은 방식으로 진행했다.
double[] subject = new double[sub];
for (int i = 0; i < subavr.length; i++) {
subject[i] = subavr[i];
}
Arrays.sort(subject);
int bestSub=0;
for(int i =0; i<sub; i++){
for(int k=0; k<sub;k++){
if(subject[sub-i-1]==subavr[k]){
bestSub = k+1;
}
}
switch (bestSub){
case 1 : System.out.printf(i+1+"등 과목은 국어 이고, 과목 평균 성적은 "+subavr[bestSub-1]+"점 입니다.");
System.out.println();
break;
case 2 : System.out.printf(i+1+"등 과목은 수학 이고, 과목 평균 성적은 "+subavr[bestSub-1]+"점 입니다.");
System.out.println();
break;
case 3 : System.out.printf(i+1+"등 과목은 영어 이고, 과목 평균 성적은 "+subavr[bestSub-1]+"점 입니다.");
System.out.println();
break;
default:
System.out.println("에러입니다.");
}
과목은 이름을 표시 해보기 위해 switch문을 사용해 보았다.
과목수를 입력할때 과목 이름도 입력 받고 밑에서 비교하여 과목이름을 출력할수있지만,
처음 코드 설계 당시 생각하지 못했던 부분이라 일일이 표기하게 하였다.
Array.sort 함수를 몰라 for문과 if문을 통해 배열의 값을 일일이 비교하고 자리를 바꾸는 식으로 진행했었다.
허나 그 방법을 사용하면 학생의 번호와 과목의 번호를 잃게되어 골머리를 앓았고 나중에 Array 함수를 알게되었다.
그래도 반복문을 통해 배열을 정렬해본 경험이 생겼고 , 반복문과 배열을 이해할수 있게되어 뿌듯한 하루였다.
'Algorithm' 카테고리의 다른 글
| 백준 10250 ACM호텔 (0) | 2022.12.13 |
|---|---|
| 2022_09_22 실습 8 (1) | 2022.09.23 |
| 2022_09_22 실습 7 (1) | 2022.09.23 |
| 2022_09_22 실습 6 (1) | 2022.09.23 |
| 2022_09_22 실습 5 (1) | 2022.09.23 |