12. 멘토링

2023. 9. 17. 16:23·알고리즘/Array(1, 2차원 배열)

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차원 배열)' 카테고리의 다른 글

실버3 달팽이 구현  (0) 2025.05.10
11. 임시반장 정하기  (2) 2023.09.16
10. 봉우리  (0) 2023.09.14
9. 격자판 최대합  (0) 2023.09.14
8. 등수 구하기  (1) 2023.09.11
'알고리즘/Array(1, 2차원 배열)' 카테고리의 다른 글
  • 실버3 달팽이 구현
  • 11. 임시반장 정하기
  • 10. 봉우리
  • 9. 격자판 최대합
koreaioi
koreaioi
  • koreaioi
    koreaioi
    koreaioi
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (162) N
      • JAVA (3)
      • 알고리즘 (88)
        • 백준 (11)
        • String(문자열) (12)
        • Array(1, 2차원 배열) (13)
        • Two pointers, Sliding windo.. (6)
        • HashMap, TreeSet(해쉬, 정렬지원 S.. (5)
        • Stack, Queue(자료구조) (8)
        • Sorting and Searching(정렬, 이.. (10)
        • Recursive, Tree, Graph(DFS,.. (14)
        • DFS, BFS 활용 (6)
        • 다시 시작! (1)
        • 기초 수학 (1)
      • 일상 (22)
      • Github (1)
      • MSA 공부 (4)
      • 경제, 금융, 디지털, 시사 (3)
      • 라즈베리파이 (10)
      • 프로젝트에서 일어난 일 (18)
      • FrontEnd 공부 (9)
        • React (8)
      • Spring (2)
      • 기술 세미나 (1)
      • DB (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
koreaioi
12. 멘토링
상단으로

티스토리툴바