본문 바로가기

알고리즘/인프런

섹션 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등을 의미합니다.

출력

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

입출력 예제


풀이 방식을 정리해보자.

 

1. 학생 수 NM을 입력받는다.

 

2. M줄에 걸쳐 N등으로 표시해야하므로 그에 맞게 arr[M][N] 배열을 선언한다.

 

3. for문을 통해 학생번호들을 입력받는다.

 

4. 메소드 구현으로 넘어가보자.

 

5. 2중 for문을 통해 멘토, 멘티(i, j) 후보를 정한다.

 

6. for문( j ) 안에서 cnt 변수를 선언하고 0으로 초기화한다.

  • cnt : 멘토, 멘티가 될 수 있는지를 저장할 변수이다.

7. 테스트 개수 즉, 행의 개수만큼 도는 for문( k ) 을 작성하고, pipj를 선언하여 0으로 초기화한다.

  • pi : i 번 학생의 등수
  • pj : j 번 학생의 등수

8. 등수 즉, 열의 개수만큼 도는 for문( s ) 를 작성한다.

  • for문( k ) : 테스트할 횟수. 행의 개수만큼 돌면서 i 번과 j번 학생의 멘토,멘티 여부를 탐색한다.
  • for문( s ) : 등수만큼 도는 for 문. k 행 s번째 열(k, s)에 있는 학생의 등수를 확인한다.

9. for문( s ) 안에 등수를 구하는 식을 작성한다.

  • 예를 들어 다음과 같은 값을 넣었다고 가정해보자.여기에서 3번과 1번인 학생들의 멘토 멘티 여부를 확인해보자.

  • for문( k ) 를 통해 0번째 테스트 케이스부터 탐색해보자.
  • 0번째 테스트 케이스에서 등수가 0번인 값을 보니 '3'이다. 3번 학생을 찾았다.
  • arr[ 0 ][ 0 ] == 3 의 식이 성립하게 된다. 테스트 0번째에서 0번 등수에 성립했으므로 이를 통해 pi에는 0 이 들어간다.
  • 즉, 3번 학생은 0등이라는 의미이다.
  • 같은 방식으로 1번인 학생도 탐색하고, 2등이라는 것을 확인할 수 있다.

10. 각 학생의 등수를 찾아서 저장한 후에는 pi와 pj를 비교해서 멘토가 멘티보다 등수가 앞서있다면 cnt에 값을 누적한다.

  • pi : 멘토 등수
  • pj : 멘티 등수

11. 그렇게 모든 테스트 개수(M)만큼 돈 후에 cnt 값이 M과 동일하다면 결과값을 누적한다.

  • cnt와 M이 동일하다는 것은 모든 테스트에서 멘토가 멘티보다 앞선 등수라는 것을 의미한다.

수행 결과를 확인한다.


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.