백준 임시 반장 정하기

KIMYEONGJUN·2024년 12월 12일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다.
학생 수는 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();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글