ezhoon

[인프런] 02_12 멘토링 본문

[Java] 인프런 문제풀이/Array(배열)

[인프런] 02_12 멘토링

ezhoon 2022. 1. 21. 12:07

📖  문제


  • 첫 줄에는 반 학생 수 N명 과 M이 주어진다.
  • 두 번째 줄부터는 M개의 줄에 걸쳐 수학 테스트 결과가 학생 번호로 주어진다.
    • 학생 번호가 제일 앞에서부터 1 ~ N 등 순으로 표현된다.
    • 이때 멘토링을 하고자 하는데 멘토가 되는 학생은 멘티의 수학 등수가 모든 테스트에서 앞서야 한다.
    • 이런 경우에 멘토링을 할 수 있는 짝이 몇 가지가 나오는지 출력하시오

 

출력 예시

 

⚠️  주의사항


  • A 학생이 B 학생의 멘토가 되기 위해선 모든 등수가 앞서야 하며 반대로 B가 A의 멘토가 되는 경우의 수도 생각해야한다.
  • 본인의 경우는 어차피 등수가 똑같으므로 따로 조건부를 할 필요가 없을것이다.

 

✍️  이해


* 1. 학생 수 N명 M개의 줄로 이루어진 수학테스트 결과
* 2. 멘토(선생) / 멘티(학생)
*  2-1. A(멘토) B(멘티)가 될려면 M번의 테스트에서 모두 A학생의 등수가 더 높아야한다
*  2-2. A학생과 B학생을 첫번째 시험부터 비교해서 높을 때 마다 cnt ++
*  2-3. cnt 값이 mathTestColumn 같다면 answer++ 증가 (멘토 멘티가 가능하다는 말)
* 3. 4중 for문

 

✏️  풀이


이 문제는 제가 제한으로 두는 최대 풀이시간인 1시간을 넘어서 강의를 듣고 코드를 이해한 뒤 다시 풀어서 구현했습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Java_02_12 {

    /**
     * 1. 학생 수 N명 M개의 줄로 이루어진 수학테스트 결과
     * 2. 멘토(선생) / 멘티(학생)
     *  2-1. A(멘토) B(멘티)가 될려면 M번의 테스트에서 모두 A학생의 등수가 더 높아야한다
     *  2-2. A학생과 B학생을 첫번째 시험부터 비교해서 높을 때 마다 cnt ++
     *  2-3. cnt 값이 mathTestColumn 같다면 answer++ 증가 (멘토 멘티가 가능하다는 말)
     * 3. 4중 for문
     */

    public int solution(int[][] temp, int student, int mathTestColumn) {

        int answer = 0;
        for(int i = 1; i <= student; i ++) { // i 학생의 등수
            for (int j = 1; j <= student; j++) { // j 학생의 등수

                int cnt = 0;
                for (int h = 0; h < mathTestColumn; h++) {
                    int pi = 0, pj = 0;

                    for (int k = 0; k < student; k++) {
                        if (temp[h][k] == i) pi = k; // i 학생의 등수 k만 바뀌므로 왼쪽 -> 오른쪽으로 가면서 확인
                        if (temp[h][k] == j) pj = k; // j 학생의 등수
                    }
                    if (pi < pj) cnt++; // 멘토인 i 학생의 값이랑 j 학생의 값 비교
                }
                if (cnt == mathTestColumn) { // 한번이라도 i의 등수가 j의 등수보다 높지 않으면 cnt == mathTestColumn 이 false가 된다.
                    answer++;
                }
            }
        }
        return answer;
    }


    public static void main(String[] args) throws IOException {

        Java_02_12 T = new Java_02_12();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int student = Integer.parseInt(st.nextToken());
        int mathTestColumn = Integer.parseInt(st.nextToken());

        int[][] temp = new int[mathTestColumn][student];
        for (int i = 0; i < mathTestColumn; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < student; j++) {
                int num = Integer.parseInt(st.nextToken());
                temp[i][j] = num;
            }
        }

        System.out.println(T.solution(temp, student, mathTestColumn));
    }
}

이렇게 Array(배열) 알고리즘 풀이가 끝이났습니다.

마지막 문제는 완벽하게 못풀어서 아쉽지만 강의를 듣고 이해하고 다시 풀었다는 것을 다행으로 생각하고 다음 주제로 넘어갈려고 합니다.

하지만 항상 드는 생각이 for문이 3개 이상 넘어가가면서 이차원 배열까지 섞이기 시작하면 혼란스럽기 시작합니다.
그래서 이를 해결 할 방법을 찾고 다시 배열 문제들을 조금씩 풀어 볼 예정입니다.
Comments