Computer Science/Algorithm

[Inflearn] 멘토링

코딩맛 2023. 2. 4. 11:07

인프런의 자바(Java)알고리즘 문제풀이 입문:코딩테스트 대비 강좌의 문제를 풀고 문제 해설을 작성해보았습니다.

 

섹션2. Array(1,2차원 배열)의 12. 임시반장 정하기 강의편 입니다.

 

설명

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

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

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

 

출력

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

import java.util.Scanner;

public class 멘토링 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] arr = new int[m][n];
		for(int i = 0; i < m; i++) {
			for(int j = 0; j < n; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		System.out.println(solution(n,m,arr));
	}
	
	public static 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++;
			}
		}
		return answer;
	}

}

 

>> 해설

변수 설명

n : 반 학생 수

m : 수학 성적의 갯수

arr : 수학 성적 결과를 저장할 배열

-> 각각을 입력 받고 solution 함수 호출

 

**solution 메소드**

변수 설명

answer : 멘토,멘티 짝이 될 수 있는 갯수 

cnt : 멘토가 멘티보다 등수가 높을 때 증가값 

pi : 수학 성적 한줄에서 i번 학생의 등수 

pj : 수학 성적 한줄에서 j번 학생의 등수

 

answer을 0으로 초기화 하고 4중 for문을 반복한다. 

 

i,j for 문은 학생들끼리 짝을 이루는 전체 경우의 수이다.

 

i - for 문 : 1부터 n까지 

j - for 문 : 1부터 n까지

cnt를 0으로 초기화 

k - for 문 : 0부터 수학 성적의 갯수까지 

pi, pj를 0으로 초기화

s - for 문 : 0부터 반 학생 수 (등수) 까지

 

arr에 저장된 값이 i번이랑 동일한 경우 pi에 등수를 저장

arr에 저장된 값이 j번이랑 동일한 경우 pj에 등수를 저장

 

pi가 pj보다 작으면(등수는 작을 수록 높은 등수) cnt를 증가

 

cnt가 m(수학 성적의 갯수)와 동일하면 answer증가시키고 answer main메소드로 리턴