문제
풀이
소스코드
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));
}
}
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];
즉, arr의 index번호와 i를 맞추기 위해 위와 같이 설정을 했다.
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; 까지 반복을 하고 최대값을 출력한다.