[배열] 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등을 의미합니다.
출력
첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.
예시 입력 1
4 3
3 4 1 2
4 3 2 1
3 1 4 2
예시 출력 1
3
<<나의 풀이>>
ㅋㅋ 일단 전체적인 형태를 생각해서 풀어 보았지만 4중 for문에 내가 올바르게 메서드를 사용했는지 모르겠다.
하지만 일단 나의 논리대로 풀어는 보았지만
이렇게 오류가 났다.
분석한 결과 내가 메서드를 잘 못 이용하고 있는 것 같다 ㅠㅠ
시간도 많이 지나고 해서 내가 틀렸다는 것을 인정하고 강사님 풀이를 보기로 했다!
import java.util.ArrayList;
import java.util.Scanner;
class Main {
public int solution(int tsn, int stn, int[][] arr) {
ArrayList<Integer> list = new ArrayList<>();
int answer = 0;
for (int i = 1; i <= stn; i++) {
for (int j = 0; j < tsn; j++) {
for (int k = 0; k < stn; k++) {
if (list.contains(arr[j][k])) {
list.remove(arr[j][k]);
}
if (arr[j][k] == i) {
for (int l = k + 1; l < stn; l++) {
list.add(arr[j][l]);
}
}
}
}
answer += list.size();
list.clear();
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int stn = in.nextInt();
int tsn = in.nextInt();
int[][] arr = new int[tsn][stn];
for (int i = 0; i < tsn; i++) {
for (int j = 0; j < stn; j++) {
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(tsn, stn, arr));
}
}
-강사님 풀이-
import java.util.Scanner;
class Main {
public int solution(int tsn, int stn, int[][] arr) {
int answer = 0;
for (int i = 1; i <= stn; i++) {
for (int j = 1; j <= stn; j++) {
int cnt = 0;
for (int k = 0; k < tsn; k++) {
int pi = 0, pj = 0;
for (int l = 0; l < stn; l++) {
if (arr[k][l] == i) pi = l;
if (arr[k][l] == j) pj = l;
}
if (pi < pj) cnt++;
}
if (cnt == tsn) answer++;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int stn = in.nextInt();
int tsn = in.nextInt();
int[][] arr = new int[tsn][stn];
for (int i = 0; i < tsn; i++) {
for (int j = 0; j < stn; j++) {
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(tsn, stn, arr));
}
}
엥 ??? 이게 뭐람..
강사님도 4중 for문을 이용했다 ㅋㅋ
물론 내가 생각했던 사고의 흐름과는 다른방향이긴하다..
첫 번째 이중 for문은 짝을 지었을 때이다. 예를 들면, i =3 j =2 이렇게 두고 그 다음 이중 포문으로 돌리면서 이렇게 되어도 문제 없나?
문제가 없다면 cnt ++ 하고 총 tsn만큼 시험 칠때까지 성립하면 최종 answer++ 하면서 경우의 수를 증가 시킨다.
후후.. 일단 나는 이 문제 풀이가 생각이 잘 나지 않았다. 강사님이 했던 사고의 흐름을 이해하고 내 것으로 만들기 위해 노력하자.
<<추가 공부>>
ArrayList의 메서드 중 contains와 remove 사용법
contains
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.contains(1)); //list에 1이 있는지 검색 : true
System.out.println(list.indexOf(1)); //1이 있는 index반환 없으면 -1
remove
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
내가 풀었던 방식에서 이를 이용했었는데, remove 메서드를 잘못 활용한 것이다.
remove(1)를 하게 되면 index 1번 자리를 제거하는 것이다.
만약, 이를 활용하려면 indexOf 메서드를 이용해서 index 값을 찾은 뒤에 그 값을 remove에 넣으면 된다.
오늘도 한 수 배운다 ㅋㅋ