11. 임시반장 정하기★
각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램
선생님은 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 합니다.
입력) 첫째 줄에는 반의 학생 수를 나타내는 정수(3 이상 1000 이하)가 주어집니다.
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 주어집니다(1~9).
출력) 첫 줄에 임시 반장으로 정해진 학생의 번호를 출력합니다.
단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력합니다.
1.
import java.util.Scanner;
public class Main {
public static int solution(int n, int[][] arr) {
int answer = 1; // 반장
int max = Integer.MIN_VALUE; // 같은 반 학생 수 최대값 // (-2^31)
// 3중 for문
for (int i=0; i<n; i++) { // 기준 학생
int cnt = 0;
for (int j=0; j<n; j++) { // 비교 할 학생
for (int k=0; k<5; k++) { // 1~5학년
// i학생의 k학년 == j학생의 k학년
if (arr[i][k]==arr[j][k]) {
cnt++;
break; // 한 번이라도 같은 반이었다면 다음 학년까지 확인할 필요 없음
}
}
}
if (cnt>max) {
max = cnt;
answer = i+1; // 반장이 되는 학생 번호
}
}
return answer;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] arr = new int[n][5];
for (int i=0; i<n; i++) {
for (int j=0; j<5; j++) { // 5학년
arr[i][j] = scanner.nextInt();
}
}
System.out.println(solution(n, arr));
}
}
2.
import java.util.Scanner;
public class Main {
public static int solution(int n, int[][] arr) {
int answer = 1; // 반장
int max = Integer.MIN_VALUE; // 같은 반이었던 학생 수 최대값
for (int i=n-1; i>=0; i--) { // 학생 번호
int[][] friend = new int[n][5];
int cnt = 0;
for (int j=0; j<5; j++) { // 학년
int classNum = arr[i][j]; // 반
for (int k=0; k<n; k++) { // 학생 번호
if (k!=i) {
if (arr[k][j]==classNum) friend[k][j] = 1;
}
}
}
for (int q=0; q<n; q++) {
for (int p=0; p<5; p++) {
if (friend[q][p]==1) {
cnt++;
break;
}
}
}
if (cnt>=max) {
max = cnt;
answer = i+1; // 반장이 되는 학생 번호
}
}
return answer;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] arr = new int[n][5];
for (int i=0; i<n; i++) {
for (int j=0; j<5; j++) {
arr[i][j] = scanner.nextInt();
}
}
System.out.println(solution(n, arr));
}
}
결과
댓글