[TIL] java 성적 알고리즘

빼곰·2022년 12월 27일
0

문제1

  • 정렬 함수를 이용하여 학생들의 성적을 꼴찌부터 1등까지 순위대로 출력해보시오.
  • 오름차순으로 정렬한다.

88,50,38,100,90,100,99,65

출력문>
화장실(정렬) 들어가기 전 = 85 50 38 100 90 100 99 65
화장실(정렬) 들어가기 후 = 38 50 65 88 90 99 100 100 // 일반 for문
화장실(정렬) 들어가기 후 = 38 50 65 88 90 99 100 100 // 향상된 for문

혼자 해보기

int[] ar = {85,50,38,100,90,100,99,64};
System.out.print("화장실(정렬) 들어가기 전 = ");
for(int i=0;i<ar.length;i++) {
	System.out.print(ar[i]+" ");
}
Arrays.sort(ar);
System.out.print("\n화장실(정렬) 들어가기 후 = ");
for(int i=0;i<ar.length;i++) {
	System.out.print(ar[i]+" ");
}
System.out.print("\n화장실(정렬) 들어가기 전 = ");
for(int i : ar) {
	System.out.print(i + " ");
}

정렬 함수 : sort()

Arrays.sort(배열명); --> 내장된 정렬 메서드(오름차순이 기본정렬)

  • import가 필요하다. -- > import java.util.Arrays;
  • 클래스 메서드로써 Arrays클래스의 인스턴스 생성없이 바로 사용가능.

선생님 코드

//[1] : 배열 선언 --> 성적 배열
int[] scores = {88,55,39,100,90,100,98,67};

// [2] : 성적배열 --> 오름차순 정렬 --> Arrays.sort(배열명); 
System.out.print("화장실(정렬) 들어가기 전 = ");
for(int i=0;i<scores.length;i++) 
	System.out.print(scores[i]+" ");
		
Arrays.sort(scores);
		
System.out.print("\n화장실(정렬) 들어가기 후 = ");
for(int i=0;i<scores.length;i++) 
	System.out.print(scores[i]+" ");

//[3] : 향상된 for문 사용
System.out.print("\n화장실(정렬) 들어가기 전 = ");
for(int i : scores) 
	System.out.print(i + " ");

출력문>
화장실(정렬) 들어가기 전 = 88 55 39 100 90 100 98 67
화장실(정렬) 들어가기 후 = 39 55 67 88 90 98 100 100
화장실(정렬) 들어가기 전 = 39 55 67 88 90 98 100 100

문제2

  • 내림차순으로 성적 순위 출력하기

배열 선언

  • 이때, 내림차순이거나 또는 원하는대로 정렬의 조건을 설정해서 하고자 할때
    기본형(Primitive Type)의 배열에는 적용이 안된다.
  • 따라서, 래퍼 클래스로 만들어서 적용해야한다.
Integer[] scores = {88,55,39,100,90,100,98,67};

성적 배열: 내림차순 정렬

Arrays.sort(배열명,컬랙션 reverseOrder); --> 추가 인자값이 필요하다!

  • import가 필요하다-->import java.util.Arrays; import java.util.Collections;
  • 참고로 string타입은 기본형이 아니다.
  • Collections클래스의 reverseOrder()메서드 사용
// [2] : 성적배열 --> 내림차순 정렬 --> Arrays.sort(배열명); 
System.out.print("화장실(정렬) 들어가기 전 = ");
for(int i=0;i<scores.length;i++) 
	System.out.print(scores[i]+" ");
// 내림차순 정렬
Arrays.sort(scores,Collections.reverseOrder());
		
System.out.print("\n화장실(정렬) 들어가기 후 = ");
for(int i=0;i<scores.length;i++) 
	System.out.print(scores[i]+" ");
//[3] : 향상된 for문 사용
System.out.print("\n화장실(정렬) 들어가기 전 = ");
for(int i : scores) 
	System.out.print(i + " ");

출력문 >
화장실(정렬) 들어가기 전 = 88 55 39 100 90 100 98 67
화장실(정렬) 들어가기 후 = 100 100 98 90 88 67 55 39
화장실(정렬) 들어가기 전 = 100 100 98 90 88 67 55 39

문제3

  • 학생들의 성적을 1등 부터 순위를 매겨서 출력해보시오.
  • 순위(Ranking) 알고리즘에 대해서 알고 있는지를 묻는 문제이다.

총 8명 학생의 성적과 등수는>
80점 -->5등 50점 -->7등 38점 --> 8등 100점 --> 1등 90점--> 4등 100--> 1등
99점-->3등 65점 --> 6등

1. 배열 선언 --> 성적배열,랭킹배열 2가지

  • 점수 배열의 크기가 변동되면(성적이 추가되면) 랭킹배열도 함께 변경되도록 선언한다.
int[] scores = {88,50,38,100,90,100,99,75};
int s_len = scores.length;
int[] ranking = new int[s_len];
		
System.out.println(scores.length);
System.out.println(ranking.length);

2. 반복문을 통해 랭킹배열 초기화하기

  • 혼자 먼저 해보기!
//[1] : 배열 선언 --> 성적 배열
int[] scores = {88,50,38,100,90,100,99,75};
int s_len = scores.length;
int[] ranking = new int[s_len];
		
System.out.println(scores.length);
System.out.println(ranking.length);
		
for(int i=0;i<s_len;i++) {
	int max=scores[i],cnt=1;
	// 랭킹 초기화
	for(int j=0;j<s_len;j++) {
		if(max<scores[j]) {
			cnt++;
		}
		ranking[i]=cnt;
	}

}
System.out.println("총 8명 학생의 성적과 등수는?");
for(int i=0;i<s_len;i++) {
	System.out.print(scores[i]+"점 --> "+ranking[i]+"등 ");
			
}

출력문>
총 8명 학생의 성적과 등수는?
88점 --> 5등 50점 --> 7등 38점 --> 8등 100점 --> 1등 90점 --> 4등 100점 --> 1등 99점 --> 3등 75점 --> 6등

  • 선생님 코드
    랭킹 초기화 - 일단은 전부 1등으로 초기화
    비교하고자 하는 값(scores[i])이 기존 값(scores[j])보다 더 작으면 순위에서 밀려나게 됨
//[2]: 반복문을 돌면서 랭킹처리
for(int i=0;i<s_len;i++) {
	// 랭킹 초기화
	ranking[i] =1;
	//중첩 반복문
	for(int j=0;j<s_len;j++) 
		if(scores[i]<scores[j]) //이때 서로 비교되고 있는 값들을 잘 이해하기!
        //System.out.println(scores[i]+"-" +scores[j] // 잘모를땐 출력해보기
			ranking[i]++;

}

3. 오름차순으로 정렬해서 출력시키기

총 8명 학생의 성적과 등수는?
38점 --> 8등 50점--> 7등 75점 --> 6등 88점 --> 5등 90점 --> 3등 100 --> 1등 100 -->1등

  • 혼자 해보기 : sort()메서드만 추가하여 풀었다.
//[1] : 배열 선언 --> 성적 배열
int[] scores = {88,50,38,100,90,100,99,75};
Arrays.sort(scores); 
int s_len = scores.length;
int[] ranking = new int[s_len];
		
System.out.println(scores.length);
System.out.println(ranking.length);
		
//[2]: 반복문을 돌면서 랭킹처리
for(int i=0;i<s_len;i++) {
	// 랭킹 초기화
	ranking[i] =1;
	//중첩 반복문
	for(int j=0;j<s_len;j++) 
		if(scores[i]<scores[j]) 
			ranking[i]++;
		
}
//출력
System.out.println("총 8명 학생의 성적과 등수는?");
for(int i=0;i<s_len;i++) {
	System.out.print(scores[i]+"점 --> "+ranking[i]+"등 ");
}

출력문 >
총 8명 학생의 성적과 등수는?
38점 --> 8등 50점 --> 7등 75점 --> 6등 88점 --> 5등 90점 --> 4등 99점 --> 3등 100점 --> 1등 100점 --> 1등

  • 선생님 코드 : 별도의 메서드를 만들어 호출
  1. PrintRanking(성적배열,랭킹배열) 만들기
	public static void printRanking(int[] scores,int[] ranking) {
		// 배열 길이
		int scores_len = scores.length;
		int ranking_len = scores_len;
//		System.out.println(scores_len);
		System.out.println("총 "+scores_len+"명 학생의 성적과 등수는?");
		for(int i=0;i<scores_len;i++)
			System.out.print(scores[i]+"점--> "+ranking[i]+"등 ");
	}
  1. 정렬하기
    오름차순으로 배열 정렬 --> Arrays.sort(배열명);
    반복문 전에 사용
		//[1] : 배열 선언 --> 성적 배열
		int[] scores = {88,50,38,100,90,100,99,75};
		int s_len = scores.length;
		int[] ranking = new int[s_len];
		
		//[1.5] : 오름차순으로 배열 정렬 --> Arrays.sort(배열명);
		Arrays.sort(scores);
        
		System.out.println(scores.length);
		System.out.println(ranking.length);
		
		//[2]: 반복문을 돌면서 랭킹처리
		for(int i=0;i<s_len;i++) {
			// 랭킹 초기화
			ranking[i] =1;
			//중첩 반복문
			for(int j=0;j<s_len;j++) 
				if(scores[i]<scores[j]) 
					ranking[i]++;
		
		}
		//출력
		printRanking(scores,ranking);

회고

java100제 part4 끝!! 알고리즘 공부한지 얼마 안됬지만 재밌다! 선생님 풀이랑 비교해가면서 풀면 시간을 그만큼 많이 걸리지만 스스로 푸는 능력이 늘어가는 것 같다. 강의 더 빨리 끝낼 수 있었는데 여러 일정때문에(핑계) 늦게 끝나서 아쉬우면서도 뿌듯하다.😎 자바 공부는 정말 끝이 없다. 자바의 신 사서 공부해볼까 고민이다. 하고 싶은게 많다.

profile
개발 블로그

0개의 댓글