백준 임시 반장 정하기

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개의 댓글

관련 채용 정보