본문 바로가기
알고리즘 문제

[알고리즘] Class President

by 박연호의 개발 블로그 2019. 4. 2.

import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int[][] ary = new int[n][6];
        List<Integer> check = new LinkedList<Integer>(); // 같은 반이였던 학생수를 확인/ 검사

        int n = sc.nextInt(); // 학생의 수
        int num; // 입력받을 값
        int value; // 현재n번째 학생의 n학년
        int max = 0; // 얼마나 많은 학생과 같은반이였는지 최대값
        int maxIndex = 0; // 가장 많은 학생들과 같은반을 한 학생
        int maxCount = 0; // 최대값이 몇번 중복되는지 확인

        for (int q = 0; q < n; q++) {
            for (int w = 0; w < 5; w++) {
                num = sc.nextInt();
                ary[q][w] = num;
            }
        }

        for (int q = 0; q < n; q++) {
            for (int w = 0; w < 5; w++) {
                value = ary[q][w];

                for (int e = 0; e < n; e++) {
                    if (q != e && value == ary[e][w]) { // 나를 제외하고, 다른 학생과 같은 반이였는지 검사,
                        if (check.contains(e)) { // 이미 한번 같은반이었던 사람은 제외.
                            continue;
                        } else {
                            ary[q][5] += 1; // 같은반이었던 사람의 수를 카운팅
                            check.add(e); // 같은 반이였던 사람의 중복체크를 위해 리스트에 추가
                        }
                    }
                }
            }

            if (ary[q][5] > max) {
                max = ary[q][5];
                maxIndex = q + 1;
            }
        }

        for (int j = 0; j < n; j++) {
            if (ary[j][5] == max) {
                maxCount++; // 같은 반이였던 사람의 최대값이 중복되는 경우를 조사하기 위함.
            }
        }

        if (maxCount == 1) {
            System.out.println(maxIndex);
            return;
        } else if (maxCount > 1) {
            for (int f = 0; f < n; f++) {
                if (ary[f][5] == max) {
                    System.out.println(f + 1);
                    return;
                }
            }
        }
    }
}

반장을 선출하는데 학생이 1~5학년 동안 다른 얼마나 많은 학생들과 같은반을 했는지에 따라 반장이 결정된다.

 

먼저 행렬에서 모든 인덱스의 값을 탐색하면서 각 인덱스마다 y축을 검사해준다. 여기서 자기 자신은 검사할 필요가 없기 때문에 자신의 행 인덱스는 제외한다. y축에서 자신의 값과 똑같은 값이 존재한다면 현재 y축의 인덱스값(비교 대상이 되는 학생)이 check에 있는지 확인한다.

(check는 학생이 중복되는 경우를 검사한다. 만약 1번 학생이 2번 학생과 2,3학년에 같은 반이면 check에 2(번 학생)을 넣어준다)

 

check에 값이 없다면 값은 check와 해당 행의 5번쨰 열에 +1을 해주게 된다. n번째 학생의 검사가 모두 끝나면 해당 행의 위치에서 5열을 검사하는데, 여기는 n번째 학생이 같은반이였던 학생의 수가 들어가 있다. 

 

출력문에서 학생들이 같은 반이였던 학생의 수의 최대값이 여러개 존재할 수 있기 때문에 n번째 학생의 검사가 끝나면 최대값과 maxIndex(최대값을 가지는 n번쨰 학생)값을 넣어준다. maxIndex는 만약 max가1일 경우만 사용된다.

 

탐색이 모두 끝나면 모든 모든 행의 5열을 검사하면서 max값을 가지는 학생이 몇명 존재하는지 조사한다. 이 값은 maxCount에 저장된다.

 

마지막으로 maxCount가 1(최대값을 가지는 학생의 수)이면 maxIndex(max값을 가지는 학생)을 출력하고, 만약 maxCount가 1보다 크다면 0행 부터 n 까지 모든 학생들의 5열을 검사하면서 첫번쨰로 max값을 가지는 학생을 출력한다.(조선에서 max값이 같은 경우 가장 작은 번호만 출력하기로 되어있음)

 

'알고리즘 문제' 카테고리의 다른 글

[알고리즘 문제] Tetris  (0) 2019.04.03
[알고리즘 문제] 대푯값  (0) 2019.04.02
[알고리즘 문제] Mine  (0) 2019.03.31
[알고리즘 문제] ColorPaper  (0) 2019.03.30
[알고리즘 문제] Offset  (0) 2019.03.27