현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니다.
멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의 수학공부를 도와주는 것입니다.
선생님은 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
import java.util.Scanner;
class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // STUDENT COUNT
int T = sc.nextInt(); // TESTCASE COUNT
int[][] arr = new int[T][N];
for (int i=0; i<T; i++) {
for (int j=0; j<N; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(solution(N, T, arr));
}
public static int solution(int N, int T, int[][] arr) {
int answer = 0;
for (int i=1; i<=N; i++) {
for (int j=1; j<=N; j++) {
int count = 0;
for (int k=0; k<T; k++) {
int pi = 0;
int pj = 0;
for (int s=0; s<N; s++) {
if (arr[k][s] == i) {
pi = s;
}
if (arr[k][s] == j) {
pj = s;
}
} //for s
if (pi < pj) {
count++;
}
} //for k
if (count == T) {
answer++;
}
} //for j
} //for i
return answer;
}
}
4중 for문을 사용해야되어서 복잡해서 주석으로 각 for문의 종점을 표시해놨다.
첫줄에 학생 수(N) 그리고 테스트 회수(T)를 입력받는다.
테스트 회수는 행이 되고 학생 수는 열이 되기 때문에 배열을 int[T][N]으로 선언한다.
이 문제를 요약한다면 i, j를 통해서 각 학생의 조합을 모두 조합하며 k번째 테스트 케이스에서 학생의 등수 s의 위치를 확인한다.
(멘토, 멘티) 의 조합이 되려면 멘토는 멘티보다 T만큼의 테스트에서 모두 등수가 커야한다. 이 말은 즉 count가 T와 같아야된다.
각 테스트마다 pi, pj(i의 인덱스, j의 인덱스를 저장)하는 변수를 초기화 시켜준다.
arr[k][s]는 k번째 테스트에서 모든 등수를 가져온다. 그리고 그 등수가 i인 경우와 j인 경우가 있다면 pi와 pj에 각각 저장한다. 멘토(i)는 항상 등수가 낮아야하기 때문에 pi<pj의 조건을 가지면 된다. 이 경우에 count를 증가시켜준다.
각 번호조합마다 케이스가 끝났다면 문제에서 요구하는 모든 케이스에서 높아야하는 경우를 만족시켜줘야하기 때문에 count==T인 경우에만 answer++를 해준다.