[코딩테스트] Array(1, 2차원 배열)

10000JI·2024년 1월 16일
0

코딩 테스트

목록 보기
2/39
post-thumbnail

Section 2. Array(1, 2차원 배열)

01. 문자 찾기

설명

N개의 정수를 입력받아, 자신의 바로 앞 수보다 큰 수만 출력하는 프로그램을 작성하세요.

(첫 번째 수는 무조건 출력한다)

입력

첫 줄에 자연수 N(1<=N<=100)이 주어지고, 그 다음 줄에 N개의 정수가 입력된다.

출력

자신의 바로 앞 수보다 큰 수만 한 줄로 출력한다.

입력예제

6
7 3 9 5 6 12

출력예제

7 9 6 12

코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//큰 수 출력하기
public class Main {
    public List<Integer> solution(int n, int[] arr) {
        List<Integer> list = new ArrayList<>();
        //첫 번째 수는 무조건 출력
        list.add(arr[0]);
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i - 1]) {
                list.add(arr[i]);
            }
        }

        return list;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        for (int x : T.solution(n, arr)) {
            System.out.print(x + " ");
        }
    }
}

02. 보이는 학생

설명

선생님이 N명의 학생을 일렬로 세웠습니다. 

일렬로 서 있는 학생의 키가 앞에서부터 순서대로 주어질 때, 맨 앞에 서 있는 선생님이 볼 수 있는 학생의 수를 구하는 프로그램을 작성하세요. 

**(앞에 서 있는 사람들보다 크면 보이고**, **작거나 같으면 보이지 않습니다.)**

입력

첫 줄에 정수 N(5<=N<=100,000)이 입력된다. 

그 다음줄에 N명의 학생의 키가 앞에서부터 순서대로 주어진다.

출력

선생님이 볼 수 있는 최대학생수를 출력한다.

입력예제

8
130 135 148 140 145 150 150 153

출력예제

5

코드

import java.util.Scanner;

//보이는 학생
public class Main {

    public int solution(int n, int[] students) {
        //맨 앞에 있는 사람은 이미 보이므로 1으로 초기화
				int cnt = 1;
				//stduent: 비교 시 키가 큰 사람 (max 값) , 맨 앞에 있는 사람 키로 초기화 
        int student = students[0];
        for (int i = 1; i < n; i++) {
            if (student < students[i]) {
                student = students[i];
                cnt++;
            }
        }
        return cnt;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] students = new int[n];
        for (int i = 0; i < n; i++) {
            students[i] = kb.nextInt();
        }
        System.out.println(T.solution(n, students));
    }
}

03. 가위 바위 보

설명

A, B 두 사람이 가위바위보 게임을 합니다.N번의 게임을 하여 A가 이기면 A를 출력하고, B가 이기면 B를 출력합니다. 비길 경우에는 D를 출력합니다.

가위, 바위, 보의 정보는 1:가위, 2:바위, 3:보로 정하겠습니다.

예를 들어 N=5이면

두 사람의 각 회의 가위, 바위, 보 정보가 주어지면 각 회를 누가 이겼는지 출력하는 프로그램을 작성하세요.

입력

첫 번째 줄에 게임 횟수인 자연수 N(1<=N<=100)이 주어집니다.

두 번째 줄에는 A가 낸 가위, 바위, 보 정보가 N개 주어집니다.

세 번째 줄에는 B가 낸 가위, 바위, 보 정보가 N개 주어집니다.

출력

각 줄에 각 회의 승자를 출력합니다. 비겼을 경우는 D를 출력합니다.

입력예제

5
2 3 3 1 3
1 1 2 2 3

출력예제

A
B
A
B
D

코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//가위 바위 보
public class Main {

    public String solution(int n, int[] a, int[] b) {
        String answer = "";
        /**
         * 1) a가 이기는 경우를 가정하여 조건문 완성
         */
        for (int i = 0; i < n; i++) {
            if (a[i] == b[i]) {
                answer += "D"; // a와 b가 비기는 경우
            } else if (a[i] == 1 && b[i] == 3) { //a가 가위(1)로 이김
                answer += "A";
            } else if (a[i] == 2 && b[i] == 1) { //a가 바위(2)로 이김
                answer += "A";
            } else if (a[i] == 3 && b[i] == 2) { //a가 보(3)로 이김
                answer += "A";
            } else {
                answer += "B"; //나머지는 모두 b가 이기는 경우
            }
        }
        return answer;

        /**
         * 2) a가 들어오는 수를 가정하여 중첩 if문 완성, 리턴이 List<String>
         */
//        List<String> list = new ArrayList<>();
//        for (int i = 0; i < n; i++) {
//            if (a[i] == 1) {
//                if (b[i] == 2) {
//                    list.add("B");
//                } else if (b[i] == 3) {
//                    list.add("A");
//                } else {
//                    list.add("D");
//                }
//            } else if (a[i] == 2) {
//                if (b[i] == 1) {
//                    list.add("A");
//                } else if (b[i] == 3) {
//                    list.add("B");
//                } else {
//                    list.add("D");
//                }
//            } else if (a[i] == 3) {
//                if (b[i] == 1) {
//                    list.add("B");
//                } else if (b[i] == 2) {
//                    list.add("A");
//                } else {
//                    list.add("D");
//                }
//            }
//        }
//        return list;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];

        for (int i = 0; i < n; i++) {
            a[i] = kb.nextInt();
        }
        for (int i = 0; i < n; i++) {
            b[i] = kb.nextInt();
        }
        for(char x : T.solution(n, a, b).toCharArray()) System.out.println(x);
    }
}

04. 피보나치 수열

설명

1) 피보나키 수열을 출력한다. 

피보나치 수열이란 앞의 2개의 수를 합하여 다음 숫자가 되는 수열이다.

2) 입력은 피보나치 수열의 총 항의 수 이다. 

만약 7이 입력되면 1 1 2 3 5 8 13을 출력하면 된다.

입력

첫 줄에 총 항수 N(3<=N<=45)이 입력된다.

출력

첫 줄에 피보나치 수열을 출력합니다.

입력예제

10

출력예제

1 1 2 3 5 8 13 21 34 55

코드

import java.util.Scanner;

//피보나치 수열
public class Main {
    /**
     * 1) 배열을 사용하여 출력
     * */
//    public int[] solution(int n) {
//        int[] anwser = new int[n];
//        anwser[0] = 1;
//        anwser[1] = 1;
//
//        for (int i = 2; i < n; i++) {
//            anwser[i] = anwser[i - 2] + anwser[i - 1];
//        }
//
//        return anwser;
//    }

    /**
     * 2) 손코딩하여 출력
     */
    public void solution(int n) {
        int a=1, b=1, c;
        System.out.print(a + " " + b + " ");
        for (int i = 2; i < n; i++) {
            c = a + b;
            System.out.print(c + " ");
            a = b;
            b = c;
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        /**
         * 1) 배열을 사용하여 출력
         */
//        for (int i : T.solution(n)) {
//            System.out.print(i + " ");
//        }
        /**
         * 2) 손코딩하여 출력
         */
        T.solution(n);
    }
}

< 손코딩 시 로직 >

05. 소수(에라토스테네스 체)

에라토스테네스 체

소수를 판별하는 알고리즘으로 소수들을 대량으로 빠르고 정확하게 구하는 방법

원리

가장 먼저 소수를 판별할 범위만큼 배열을 할당하여, 할당하는 값을 넣어주고, 이후에 하나씩 지워나가는 방법 이용

(1) **배열을 생성하여 초기화**한다.

(2) **2부터 시작해서 특정 수의 배수에 해당하는 수를 모두 지운다.** 
	( 지울 때 자기자신은 지우지 않고 **이미 지워진 수는 건너뛴다.**)

(3) 2부터 시작하여 **남아있는 수를 모두 출력**한다.

설명

자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.

만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다.

입력

첫 줄에 자연수의 개수 N(2<=N<=200,000)이 주어집니다.

출력

첫 줄에 소수의 개수를 출력합니다.

입력예제

20

출력예제

8

< ”에라토스테네스 체“적용한 코드 설명 >

코드

import java.util.Scanner;

//소수(에라토스테네스 체)
public class Main{

    public int solution(int n) {
        int answer = 0;
        //인덱스 번호가 n번 까지 생겨야 함
        int[] ch = new int[n + 1];
        for (int i = 2; i <= n; i++) {
            //이중 for문에서 ch[j]=1에 걸린 숫자는 if문에 들어오지 못함 -> 따라서 추후에 if문 실행이 안됨으로 소수를 담는 answer에 해당 X
            if (ch[i] == 0) {
                answer++;
                //j는 i의 배수로 for문 돌아야 함
                //이중 for문 j에서 걸리는 숫자들은 이전 숫자들 중 한개라도 배수에 들지 않음을 증명
                for (int j = i; j <= n; j = j + i) {
                    //i의 배수에 해당되는 숫자는 1을 대입
                    ch[j] = 1;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        MainT = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        System.out.println(T.solution(n));
    }
}

06. 뒤집은 소수

설명

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요.

예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다.910를 뒤집으면 19로 숫자화 해야 한다.

첫 자리부터의 연속된 0은 무시한다.

입력

첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다.

각 자연수의 크기는 100,000를 넘지 않는다.

출력

첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.

입력예제

9
32 55 62 20 250 370 200 30 100

100은 뒤집으면 1이다. 1은 소수가 아니므로 출력 X

출력예제

23 2 73 2 3

< 예시 계산식 >

코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//뒤집은 소수
public class Main{

    public boolean isPrime(int num){
        //1은 소수가 아님
        if (num == 1) {
            return false;
        }
        //1 건너뛰고 2부터 num 전까지 num이 소수인지 확인
        //num보다 작은 수들을 나눴을때 나머지가 0 이면(=약수 발견) 소수 X
        for (int i = 2; i < num; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }

    public List<Integer> solution(int n, int[] arr) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int tmp = arr[i];
            int res = 0;
            while (tmp > 0) {
                int t = tmp % 10; //나머지
                res = res * 10 + t;
                tmp = tmp / 10; //몫
            }
            if (isPrime(res)) {
                list.add(res);
            }
        }
        return list;
    }

    public static void main(String[] args) {
        MainT = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        for (int x : T.solution(n, arr)) {
            System.out.print(x+" ");
        }
    }
}

07. 점수계산

설명

OX 문제는 맞거나 틀린 두 경우의 답을 가지는 문제를 말한다.

여러 개의 OX 문제로 만들어진 시험에서 연속적으로 답을 맞히는 경우에는 가산점을 주기 위해서 다음과 같이 점수 계산을 하기로 하였다.

1번 문제가 맞는 경우에는 1점으로 계산한다. 앞의 문제에 대해서는 답을 틀리다가 답이 맞는 처음 문제는 1점으로 계산한다.

또한, 연속으로 문제의 답이 맞는 경우에서 두 번째 문제는 2, 세 번째 문제는 3, ..., K번째 문제는 K점으로 계산한다. 틀린 문제는 0점으로 계산한다.

예를 들어, 아래와 같이 10 개의 OX 문제에서 답이 맞은 문제의 경우에는 1로 표시하고, 틀린 경우에는 0으로 표시하였을 때,

점수 계산은 아래 표와 같이 계산되어, 총 점수는 1+1+2+3+1+2=10 점이다.
시험문제의 채점 결과가 주어졌을 때, 총 점수를 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 문제의 개수 N (1N100)이 주어진다. 둘째 줄에는 N개 문제의 채점 결과를 나타내는 0 혹은 1이 빈 칸을 사이에 두고 주어진다.

0은 문제의 답이 틀린 경우이고, 1은 문제의 답이 맞는 경우이다.

출력

첫째 줄에 입력에서 주어진 채점 결과에 대하여 가산점을 고려한 총 점수를 출력한다.

입력예제

10
1 0 1 1 1 0 0 1 1 0

출력예제

10

코드

import java.util.Scanner;

//점수계산
public class Main{
    public int solution(int n, int[] arr) {
        int answer = 0;
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if (arr[i] == 1) {
                cnt++;
                //누적
                answer += cnt;
            } else {
                //0이면 초기화
                cnt = 0;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        System.out.println(T.solution(n, arr));
    }
}

08. 등수구하기

설명

N명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.

같은 점수가 입력될 경우 높은 등수로 동일 처리한다.

**즉 가장 높은 점수가 92점인데 92점이 3명 존재하면 1등이 3**이고 그 **다음 학생은 4**이 된다.

입력

첫 줄에 N(3<=N<=100)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력된다.

출력

입력된 순서대로 등수를 출력한다.

입력예제

5
87 89 92 100 76

출력예제

4 3 2 1 5

코드

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//등수 구하기
public class Main{

    public int[] solution(int n, int[] arr) {
        int[] answer = new int[n];
        for (int i = 0; i < n; i++) {
            int cnt = 1;
            for (int j = 0; j < n; j++) {
                if (arr[i] < arr[j]) {
                    cnt++;
                }
                answer[i] = cnt;
            }
        }
        return answer;
    }
    public static void main(String[] args) {
        MainT = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        for (int i : T.solution(n, arr)) {
            System.out.print(i+" ");
        }
    }
}

09. 격자판 최대합

설명

5*5 격자판에 아래롸 같이 숫자가 적혀있습니다.

*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.

입력

첫 줄에 자연수 N이 주어진다.(2<=N<=50)

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력

최대합을 출력합니다

입력예제

5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

출력예제

155

코드

import java.util.Scanner;

//등수 구하기
public class Main{

    public int solution(int n, int[][] arr) {
        int answer = Integer.MIN_VALUE;
        int sum1 = 0, sum2 = 0;
        for (int i = 0; i < n; i++) {
            sum1 = sum2 = 0;
            for (int j = 0; j < n; j++) {
                //행끼리
                sum1 += arr[i][j];
                //열끼리
                sum2 += arr[j][i];
            }
            answer = Math.max(sum1, answer);
            answer = Math.max(sum2, answer);
        }
        sum1 = sum2 = 0;
        for (int i = 0; i < n; i++) {
            sum1 += arr[i][i]; //좌측부터 우측으로 내려가는 대각선
            sum2 += arr[i][n-1-i]; //우측부터 좌측으로 내려가는 대각선
        }
        answer = Math.max(sum1, answer);
        answer = Math.max(sum2, answer);
        return answer;
    }
    public static void main(String[] args) {
        MainT = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[][] arr = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = kb.nextInt();
            }
        }
        System.out.println(T.solution(n, arr));
    }
}

10. 봉우리

설명

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.

각 격자판의 숫자 중 **자신의 상하좌우 숫자보다 큰 숫자**는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.

격자의 가장자리는 0으로 초기화 되었다고 가정한다.

만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

입력

첫 줄에 자연수 N이 주어진다.(2<=N<=50)

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력

봉우리의 개수를 출력하세요.

입력예제

5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2

출력예제

10

코드

import java.util.Scanner;

//봉우리
public class Main {
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, 1, 0, -1};

    public int solution(int n, int[][] arr) {
        int answer = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                boolean flag = true;
                for (int k = 0; k < 4; k++) {
                    int nx = i + dx[k];
                    int ny = j + dy[k];
                    // 인덱스를 -1번을 볼 수 있으므로 0부터 4까지 인덱스임을 명시해줘야 한다 ( 선행 조건 )
                    // 네방향의 값이 내 자신보다 크거나 같다면 나는 봉우리가 아니다! -> flag=false;
                    // 고로 for문을 빠져나가야 되므로 break;
                    if (nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny] >= arr[i][j]) {
                        flag = false;
                        break;
                    }
                }
                //자기 자신이 네 방향 값보다 크면 봉우리이므로 answer++
                if (flag) {
                    answer++;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[][] arr = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = kb.nextInt();
            }
        }
        System.out.println(T.solution(n,arr));
    }
}

11. 임시반장 정하기

설명

김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.

김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.

그는 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.

그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.

예를 들어 학생 수가 5명일 때의 표를 살펴보자.
위 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,

2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한번이라도

같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.

이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.

각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.

입력

첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.

둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.

주어지는 정수는 모두 1 이상 9 이하의 정수이다.

출력

첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다., 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.

입력예제

5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2

출력예제

4

코드

import java.util.Scanner;

// 임시반장
public class Main {
    public int solution(int n, int[][] arr) {
        int answer = 0, max = Integer.MIN_VALUE;
        **//i는 기준이 되는 학생 번호**
        for (int i = 1; i <= n; i++) {
            **//학생 번호가 바뀌면 cnt 초기화**
            int cnt = 0;
            **//j는 비교 대상이 되는 학생 번호**
            for (int j = 1; j <= n; j++) {
                **//k: 학년**
                for (int k = 1; k <= 5; k++) {
                    if (arr[i][k] == arr[j][k]) {
                        cnt++;
                        **//k에 대한 for문이 종료**
                        //동일한 번호의 학생이 **다음 학년에 또 같은 반이 될 수 있으므로 break 걸어줌**
                        break;
                    }
                }
            }
            **//학생번호가 바뀌기 전에, 기존에 저장된 "같은 반이 되었던 학생 수"와 비교하여 크다면 max 값에 넣어주고, answer에는 학생 번호가 담긴다.**
            if (cnt > max) {
                max = cnt;
                answer = i;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[][] arr = new int[n+1][6];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= 5; j++) {
                arr[i][j] = kb.nextInt();
            }
        }
        System.out.println(T.solution(n, arr));
    }
}

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

출력

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

입력예제

4 3
3 4 1 2
4 3 2 1
3 1 4 2

출력예제

3

힌트

출력설명

(3, 1), (3, 2), (4, 2)와 같이 3가지 경우의 (멘토, 멘티) 짝을 만들 수 있다.

코드

import java.util.Scanner;

// 멘토링
public class Main {

    public 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 cnt=0;
                for(int k=0; k<m; k++){
                    int pi=0, pj=0;
                    for(int s=0; s<n; s++){
                        if(arr[k][s]==i) pi=s;
                        if(arr[k][s]==j) pj=s;
                    }
                    //등수비교
                    if(pi<pj) cnt++;
                }
                if(cnt==m){
                    answer++;
                    //System.out.println(i+" "+j);
                }
            }
        }
        return answer;
    }

    public static void main(String[] args){
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n=kb.nextInt();
        int m=kb.nextInt();
        int[][] arr=new int[m][n];
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                arr[i][j]=kb.nextInt();
            }
        }
        System.out.print(T.solution(n, m, arr));
    }
}

profile
Velog에 기록 중

0개의 댓글