1. 문제
첫줄에 n(학생 수), m (시험 수 입력)
m * n 행렬로 시험 결과를 입력 받음
0번 인덱스가 1등, 1번 인덱스가 2등 .....으로 순위가 매겨짐 헷갈리지말자.
4 3
//3번 > 4번 > 1번 > 2번 학생 순으로 순위가 매겨졌다는 뜻.
3 4 1 2
4 3 2 1
3 1 4 2
2 - 1. 나의 풀이
1. 학생의 관계를 표현한 N * N 행렬을 만들어서 기본으로 1의 값이 들어간다.
2. n번 학생의 인덱스를 구하는 findindexof 메서드를 만들었다.
3. findindexof 메서드를 통해 인덱스를 비교해 조건에 맞으면 N * N 행렬의 값을 0으로 변경한다.
예시로 첫번째 시험에서 1번 학생과 3번 학생의 인덱스를 비교할 때 첫 번째 시험에서 1번 학생은 3번학생보다 시험을 못봤으므로 (인덱스가 더 크므로) N * N 행렬에서 [1][3]의 값을 0 으로 바꿔준다. (1번 학생은 3번 학생의 멘토가 될 수 없다.)
4. 반복하고나서 N * N의 값을 누적합 한 다음 N 만큼을 제외한다.
자기 자신과 비교할 경우[1][1]의 값을 제외하기 위함.
2 - 2. 나의 코드
package Algorythm_Array;
import java.util.Scanner;
public class Array12 {
//n번 학생의 인덱스를 반환해주는 메서드.
public static int findindexOf(int[] arr, int n) {
int index =-1;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == n)return i;
}
return index;
}
public static int solution(int[][] intArr, int n , int m) {
int answer = 0;
int[][] tmp = new int[n][n];
//학생 두 명이 만나는 경우의 수를 표현한 배열 생성 n * n
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
tmp[i][j] = 1;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
//찾는수(학생 번호)는 0~n이 아니라, 1~n+1 까지 이므로 j와 k에 +1해줘야한다.
if(findindexOf(intArr[i], j+1 ) > findindexOf(intArr[i], k+1)) tmp[j][k] =0;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
answer += tmp[i][j];
}
}
//[1][1], [2][2] 에 들어가있는값을 빼주기 위함
answer -=n;
return answer;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] intArr = new int[m][n];
//n = 4, m =3
//n = 학생 수, m은 시험 수
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
intArr[i][j] = sc.nextInt();
}
}
System.out.println(solution(intArr, n,m));
}
}
3 - 1. 강의 풀이
문제에 접근한 방식은 비슷하다 (인덱스 비교!)
나는 인덱스를 비교하는 메서드를 만든 다음 n * n 행렬에 따로 저장했다.
강의에서는 인덱스를 비교해 count 한 다음, count와 m번의 시험 회수가 같은지를 또 비교해 멘토를 선별한다.
count와 m이 같다는 건 i가 j에 비해 모든 인덱스가 작아 시험을 잘봤다는 의미이므로 멘토를 선별한다.
강의에서는 4중 for문을 이용해 풀었고
나는 n * n 행렬을 따로 만들어 3중 for문으로 풀었다.
코드 간결성으로는 4중 for문이 더 좋다.
3 - 2. 강의 코드
package Algorythm_Array;
import java.util.Scanner;
public class Array12_solution {
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 count =0;
for (int k = 0; k < m; k++) {
int pi = 0, pj = 0;
//i와 j 학생의 인덱스를 찾고 반복문이 끝날 때 비교한다.
for (int s = 0; s < n; s++) {
if(arr[k][s] == i) pi = s;
if(arr[k][s] == j) pj = s;
}
//i와 j 의 인덱스를 비교해 i 가 더 작으면, 시험을 더 잘봤으면 count++
if(pi < pj) count++;
}
//count 와 시험 회수가 같아야한다.
if (count == m) {
answer++;
}
}
}
return answer;
}
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));
}
}
4. 얻어갈 점
1. 다양한 접근 방식
2. 4중 for문도 각 변수에 의미를 생각하면서 for문이 돌아가는 과정을 생각하면 풀 수 있다.
'자바 알고리즘 문제풀이 > Array(1, 2차원 배열)' 카테고리의 다른 글
11. 임시반장 정하기 (2) | 2023.09.16 |
---|---|
10. 봉우리 (0) | 2023.09.14 |
9. 격자판 최대합 (0) | 2023.09.14 |
8. 등수 구하기 (1) | 2023.09.11 |
7. 점수 계산 (0) | 2023.09.10 |