오늘보다 더 나은 내일의 나에게_

자바 알고리즘 문제 풀이 Array Q11_임시반장 정하기 본문

ALGORITHM/inflearn_javaAlgorithm

자바 알고리즘 문제 풀이 Array Q11_임시반장 정하기

chan_96 2022. 2. 19. 22:27
728x90
설명

김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.

김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.

그는 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.

그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.

예를 들어 학생 수가 5명일 때의 표를 살펴보자.

위 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,

2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한번이라도

같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.

이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.

각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.


입력

첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.

둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.

주어지는 정수는 모두 1 이상 9 이하의 정수이다.


출력

첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.

단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.



예시 입력1


예시 출력

5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2
4

 

코드

내가 입력한 코드

더보기
package Array;

import java.util.Scanner;

public class Q11 {
	public int solution(int n, int[][] arr){
		int answer = 0;
		
		for (int i = 0; i < 5; i++) {
			int cnt = 0;
			for (int j = 1; j < n; j++) {
				if(arr[0][i] == arr[j][i]) {
					cnt++;
				}
			}
			if(answer < cnt) {
				answer = cnt;
			}
		}
		
		return answer;
	}
	
	public static void main(String[] args) {
		Q11 T = new Q11();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		int[][] arr = new int[n][5];
		
		for(int i = 0;i < n;i++){
			for(int j = 0;j < 5;j++){
				arr[i][j] = kb.nextInt();
			}
		}
		
		System.out.println(T.solution(n, arr));
	}
}

해설 코드

import java.util.*;
class Main {	
	public int solution(int n, int[][] arr){
		int answer=0, max=0;
		for(int i=1; i<=n; i++){
			int cnt=0;
			for(int j=1; j<=n; j++){
				for(int k=1; k<=5; k++){
					if(arr[i][k]==arr[j][k]){
						cnt++;
						break;
					}
				}
			}
			if(cnt>max){
				max=cnt;
				answer=i;
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int[][] arr=new int[n+1][6];
		for(int i=1; i<=n; i++){
			for(int j=1; j<=5; j++){
				arr[i][j]=kb.nextInt();
			}
		}
		System.out.print(T.solution(n, arr));
	}
}

 

 

풀이 및 정리 

1학년부터 5학년까지 주어져있고 학생수는 입력받아야 한다.
그래서 2차원 배열을 만들 때 표와같이 인덱스 0은 사용하지않고 만들어야 한다.
int[][] arr = new arr[n+1][6]
학생들을 비교할 때 본인의 반과 비교해 cnt를 증가시켜줘도 모든 학생이 +1이 되기때문에 결과에는 차이가 없다. 3중 for문을 사용하면 된다. for문의 인덱스 값은 1번째 for문은 지정된 학생, 2번째 for문은 비교할 학생, 3번째 for문은 학년이 된다.
1번 학생과 1번 학생을 비교하고 같은 값이 있으면 반복문을 종료 즉 for문이 시작하자마자 값이 같으므로 cnt는 증가하고 바로 다음 학생과 비교한다. 1번학생과 2번학생의 1학년, 2학년, 3학년, 4학년, 5학년 차례대로 비교해 같은 값이 있으면 cnt값을 증가시키고 반복문을 종료한다. 후에 3번 학생과 비교하고 4번 학생, 5번 학생과 비교한다. 그리고 cnt값은 임의의 변수 max에 담아주고 그 때의 i번째 인덱스 값을 anwer에 넣어준다.

1번 학생이 1~5번 학생과 비교가 끝나면 이제 2번 학생을 비교해준다.
2번 학생을 1~5번 학생과 비교하고, 그다음에 3번 학생을 1~5번 학생과 비교한다. 
4번, 5번 학생도 똑같이 비교해 준다. 반복이 끝날 때마다 cnt값을 이전에 cnt변수의 값이 담긴 max값과 비교시켜주고 새로 증가된 cnt값이 크면 다시 max에 담아주고 i의 값을 answer에 넣어준다.
728x90
Comments