내가 생각했을때 문제에서 원하는부분
첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다.
학생 수는 3 이상 1000 이하이다.
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다. 주어지는 정수는 모두 1 이상 9 이하의 정수이다.
첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.
내가 이 문제를 보고 생각해본 부분
n: 학생 수를 입력받는다.
classes: 2차원 배열로, 각 학생의 1학년부터 5학년까지의 반 정보를 저장한다.
maxSameClassCount: 같은 반 경험이 가장 많은 학생 수를 저장한다.
leaderIndex: 임시 반장 후보의 인덱스를 저장한다.
학생 반 정보 입력:
각 학생의 반 정보를 입력받아 classes 배열에 저장한다.
StringTokenizer를 사용하여 한 줄의 입력을 공백으로 분리한다.
같은 반 경험 계산:
classmates: 현재 학생과 같은 반이었던 학생들을 저장하는 집합이다.
첫 번째 루프(i): 현재 학생을 선택한다.
두 번째 루프(j): 1학년부터 5학년까지 반복한다.
세 번째 루프(k): 다른 학생들과 비교하여 같은 반인 경우 classmates 집합에 추가한다.
자신과 비교하지 않기 위해 i != k 조건을 사용한다.
최대 같은 반 학생 수 갱신:
현재 학생의 같은 반 경험 수가 기존의 최대 수보다 크면, maxSameClassCount를 업데이트하고 leaderIndex를 현재 학생의 인덱스로 설정한다.
최종적으로 임시 반장으로 선정된 학생의 인덱스를 1부터 시작하는 번호로 출력한다.
배열 인덱스는 0부터 시작하므로 +1을 해준다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
// 백준 1268번 문제
public class Main865 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 학생 수 입력
int[][] classes = new int[n][5]; // 학생의 반 정보를 저장할 배열
int maxSameClassCount = 0; // 최대 같은 반 학생 수
int leaderIndex = 0; // 임시 반장 후보 인덱스
// 학생들의 반 정보 입력
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < 5; j++) {
classes[i][j] = Integer.parseInt(st.nextToken());
}
}
// 각 학생에 대해 같은 반 경험이 있는 학생 수 계산
for(int i = 0; i < n; i++) {
Set<Integer> classmates = new HashSet<>(); // 같은 반 학생을 저장할 집합
for(int j = 0; j < 5; j++) { // 1학년부터 5학년까지 반복
for(int k = 0; k < n; k++) { // 다른 학생들과 비교
if(i != k && classes[i][j] == classes[k][j]) {
classmates.add(k); // 같은 반이었던 학생 추가
}
}
}
// 최대 같은 반 학생 수 갱신
if(classmates.size() > maxSameClassCount) {
maxSameClassCount = classmates.size();
leaderIndex = i; // 현재 학생을 임시 반장 후보로 설정
}
}
// 최종 결과 출력
System.out.println(leaderIndex + 1); // 1부터 시작하는 번호로 출력
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.