Algorithm

[Algorithm/Java] 알고리즘 자바 임시반장 정하기 (코딩테스트, Array, 배열, 중복값이 많은 인덱스 구하기)

권락현 2022. 3. 31. 00:18


1. 문제 설명

  • 설명
    김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.
    김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.
    그는 자기 반 학생 중에서 1학년부터 5학년까지 지내오면서 한 번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.
    그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.
    예를 들어 학생 수가 5명일 때의 표를 살펴보자.
    아래의 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,
    2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한 번이라도
    같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.
    이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.
    각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.
  1학년 2학년 3학년 4학년 5학년
1번 2 3 1 7 3
2번 4 1 9 6 8
3번 5 5 2 4 4
4번 6 5 2 6 7
5번 8 4 2 2 2
  • 입력
    첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.
    둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.
    주어지는 정수는 모두 1 이상 9 이하의 정수이다.
  • 출력 : 첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다. 단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그중 가장 작은 번호만 출력한다.
  • 출처 : 한국정보올림피아드

 

2. 문제 코드 및 풀이 설명

import java.util.Scanner;

public class ChoosePresident {
  public static void main(String[] args) {
    ChoosePresident T = new ChoosePresident();
    Scanner kb = new Scanner(System.in);
    int n = kb.nextInt();
    int[][] arr = new int[n][5];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < 5; j++) {
        arr[i][j] = kb.nextInt();
      }
    }
    System.out.println(T.solution(arr, n));
  }

  // 해결방법
  // 각 학생 별로 반복문을 돌려서 같은 값을 비교
  // 삼중 반복문을 사용하여 각 학생의 학년별, 학생별 중복 값 비교
  public int solution(int[][] arr, int n) {
    int answer = 0, max = 0;
    for (int i = 0; i < n; i++) { // 각 학생별로 반복
      int cnt = 0;
      for (int j = 0; j < n; j++) { // 선택된 학생과 다른 학생을 비교 반복
        for (int k = 0; k < 5; k++) { // 다른 학생과 학년별로 같은 경우가 있는지 확인
          // 비교시에 같은 경우가 있다면 카운트 후 break
          if (arr[i][k] == arr[j][k]){
            cnt++;
            break;
          }
        }
      }
      // 카운트했을때 더 클때만 바꾸어줌
      // 더 클때만 바꾸기에 같을 경우 먼저 비교한 학생의 번호가 저장됨
      if(cnt>max){
        max = cnt;
        answer = i + 1; // 0번부터 시작했으니 1 더해줌
      }
    }
    return answer;
  }
}

 

3. 출력 예시

입력
5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2

출력
4

 

 


위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!

https://inf.run/iAi6

 

자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com