본문 바로가기
Java/Coding-Test

[Java] 2-12 멘토링

by JS1111 2022. 1. 18.

문제

현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니다.
멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의 수학공부를 도와주는 것입니다.
선생님은 M번의 수학테스트 등수를 가지고 멘토와 멘티를 정합니다.
만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면,
A학생은 M번의 수학테스트에서 모두 B학생보다 등수가 앞서야 합니다.
M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇 가지 인지 출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 반 학생 수 N(1<=N<=20)과 M(1<=M<=10)이 주어진다.
두 번째 줄부터 M개의 줄에 걸쳐 수학테스트 결과가 학생번호로 주어진다.
학생번호가 제일 앞에서부터 1등, 2등, ...N등 순으로 표현된다.
만약 한 줄에 N=4이고, 테스트 결과가 3 4 1 2로 입력되었다면,
3번 학생이 1등, 4번 학생이 2등, 1번 학생이 3등, 2번 학생이 4등을 의미합니다
출력
첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.
예시 입력

4 3
3 4 1 2
4 3 2 1
3 1 4 2

예시 출력

3

출처
인프런 - 자바-알고리즘-문제풀이-코테대비

내 풀이

private static int countCase(int numOfStudent, int numOfTest, int[][] inputs) {
    // 2차원배열을 2차원ArrayList로 옮긴다, lists.get(0)는 첫 시험의 등수들을 가진다
    List<List<Integer>> lists = new ArrayList<>();
    for (int i = 0; i < numOfTest; i++) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int j = 0; j < numOfStudent; j++) {
            list.add(inputs[i][j]);
        }
        lists.add(list);
    }

    int count = 0;
    for (int i = 0; i < numOfStudent; i++) { // (i+1)번 맨토
        for (int j = 0; j < numOfStudent; j++) { // (j+1)번 맨티
            boolean isPossible = true;
            if (i == j) continue;
            for (int k = 0; k < numOfTest; k++) { // 시험 수 만큼 반복
                List<Integer> list = lists.get(k);
                // 인덱스+1이 i+1번 맨토의 등수
                int rankOfMentor = list.indexOf(i + 1) + 1;
                int rankOfMentee = list.indexOf(j + 1) + 1;
                if (rankOfMentor > rankOfMentee) {
                    isPossible = false;
                    break;
                }
            }
            if (isPossible) { // 모든 시험에 대해서 true면 (i+1)-(j+1)은 가능
              //System.out.printf("가능: (%d번, %d번)\n", i + 1, j + 1);
                count++;
            }
        }
    }
    return count;
}

List를 쓰지 않고 그냥 for문을 한번 더 썼어야 했다

다른 풀이

/* 강의 풀이 */
public static int solution(int n, int m, int[][] arr) {
    int answer = 0;
    for (int i = 1; i <= n; i++) { // 맨토 1~n번
        for (int j = 1; j <= n; j++) { // 맨티 1~n번
            int cnt = 0; // 맨토가 맨티보다 등수가 높은 시험 수 저장
            for (int k = 0; k < m; k++) { // 시험 수만큼 반복
                int pi = 0, pj = 0;       // 시험 등수를 저장
                for (int s = 0; s < n; s++) { // 한 시험의 결과 순환 (s=등수)
                    // arr[k][s]가 자신의 번호와 같다면 s가 자신의 등수
                    if (arr[k][s] == i) pi = s;
                    if (arr[k][s] == j) pj = s;
                }
                if (pi < pj) cnt++; // 맨토가 맨티보다 등수가 높으면 cnt++;
            }
            if (cnt == m) { // 맨토가 맨티보다 등수가 높은적이 == 시험 수 일 떄
                answer++;   // 맨토-맨티 가능
              //System.out.println(i+" "+j);
            }
        }
    }
    return answer;
}

'Java > Coding-Test' 카테고리의 다른 글

[Java] 3-2 공통원소 구하기  (0) 2022.01.19
[Java] 3-1 두 배열 합치기  (0) 2022.01.19
[Java] 2-11 임시반장 정하기  (0) 2022.01.18
[Java] 2-10 봉우리  (0) 2022.01.18
[Java] 2-9 격자판 최대합  (0) 2022.01.18

댓글