오늘보다 더 나은 내일의 나에게_

자바 알고리즘 문제 풀이 Array Q12_멘토링 본문

ALGORITHM/inflearn_javaAlgorithm

자바 알고리즘 문제 풀이 Array Q12_멘토링

chan_96 2022. 2. 22. 23:17
728x90
설명

현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니다.

멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의 수학공부를 도와주는 것입니다.

선생님은 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등을 의미합니다.


출력

첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.

 

예시 입력1


예시 출력

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

힌트

출력설명

(3, 1), (3, 2), (4, 2)와 같이 3가지 경우의 (멘토, 멘티) 짝을 만들 수 있다.

 

코드

해설 코드

import java.util.*;
class Main {	
	public int solution(int n, int m, int[][] arr){
		int answer=0;
		for(int i=1; i<=n; i++){
			for(int j=1; j<=n; j++){
				int cnt=0;
				for(int k=0; k<m; k++){
					int pi=0, pj=0;
					for(int s=0; s<n; s++){
						if(arr[k][s]==i) pi=s;
						if(arr[k][s]==j) pj=s;
					}
					if(pi<pj) cnt++;
				}
				if(cnt==m){
					answer++;
					//System.out.println(i+" "+j);
				}
			}
		}
		return answer;
	}

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

 

 

풀이 및 정리 

멘토, 멘티 경우의 수를 구하면 예시입력으로 계산해보면 4*4(n*n)로 16이다.
그 경우의 수에서 시험 횟수, 등 수의 경우의 수를 생각해보면 for문이 4번 작성되어야 한다.
첫번째 for문은 멘토, 두번째 for문은 멘티, 세번째 for문은 시험횟수, 네번째 for문은 등수 로 작성하면 될듯하다.

첫번째 for문 멘토, 두번째 for문 멘티의 변수를 각각 i,j라고 했을 때
i,j값을 비교할때 세번째,네번째 for문이 돌고나서 
cnt변수(횟수 증가시키는 변수)가 m(시험횟수)와 같으면 결과적으로 i,j값이 멘토, 멘티가 될 수 있는 상황이므로 answer값을 증가시켜준다.

728x90
Comments