[알고리즘] 배열(11) : 임시 반장 정하기(JAVA)

ho's·2022년 5월 23일
0

문제

풀이

  • 배열을 선언할때 1번~ N번까지 있다.
  • 2중 for문을 이용한다.

소스코드


package algolecture;
import java.util.Scanner;
public class Main23 {
    public int solution(int n, int[][] arr){

        int answer = 0, max=Integer.MIN_VALUE;
        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) {
        Main23 T = new Main23();
        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.println(T.solution(n, arr));
    }
}

🥇소스코드 분석

main 메소드

public static void main(String[] args){
	Main23 T = new Main23();
    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));
}

int[][] arr = new int[n+1][6];
  • int[][] arr = new int [n][5]; 가 아닌 n+1, 6을 해주었다.
    위의 배열을 입력하면, arr의 인덱스는 n-1, 4까지 생성이 된다.

즉, arr의 index번호와 i를 맞추기 위해 위와 같이 설정을 했다.

solution 메소드

 public int solution(int n, int[][] arr){

        int answer = 0, max=Integer.MIN_VALUE;
        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 int solution(int n, int[][] arr){}

  • public 필드에 반환값은 int 메소드명은 solution, 매개변수는 main에서 입력받은 int n과 int[][] arr를 받는다.

    int max = Integer.MIN_VALUE; max값을 정수형태의 최솟값으로 설정한다.

    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;
       }
    }
  • k는 학년을 나타내는 인덱스이다. arr[i][1] == arr[j][1] 이라면 1학년때 i와 j는 같은 학년임을 뜻한다.

  • if(arr[i][k] == arr[j][k]이면 cnt++을 하고 break;를 하는 이유
    1학년때 학생1과 2가 같은반이었고, 4학년때도 학생1과 2가 같은반이 었다면 cnt가 2증가한다.
    위의 문제 상황에서는 바라지 않는 상황이다.

  • 처음 반복문 j를 빠져 나오면 i=1이므로 1번 학생과 같은 반이었던 학생의 수가 cnt에 저장되고 그 값은 max가 된다. (처음 max의 값은 Integer.MIN_VALUE 이었기 때문이다.

  • 위와 같은 방법으로 i=1; i<=n; 까지 반복을 하고 최대값을 출력한다.

profile
그래야만 한다

0개의 댓글