배열(Array) 섹션 - (3)

728x90

배열(Array) 섹션 - (3)

2-9. 격자판 최대합

  • 각각의 행의 합, 열의 합 = 이중 for문 돌면서 arr[i][j] 누적 or arr[j][i] 누적
  • 두 대각선 각각의 합 = 그냥 for문 돌면서 arr[i][i] 누적 or arr[i][n-i-1] 누적
import java.util.Scanner;

/* 2-9. 격자판 최대합 
[입력]첫 줄에 자연수 N이 주어진다.(2<=N<=50)
    두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 
    각 자연수는 100을 넘지 않는다.
[출력]최대합 출력
*/
public class Main1 {
    //솔루션 함수 
    public int solution(int n, int[][]arr) {
        int answer = Integer.MIN_VALUE;
        int sum1, sum2;

        //1) 행의 합, 열의 합 한번에 구하기 
        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에는 더 큰 값이 비교된 뒤 저장됨
            answer = Math.max(answer, sum1);
            answer = Math.max(answer, sum2);
        }
        //2) 두 대각선의 합 (sum1. sum2)
        sum1 = sum2 = 0;
        for(int i=0; i<n; i++) {
            //왼쪽 대각선 합 
            sum1 += arr[i][i];
            //오른쪽 대각선 합
                    //주의 n에 따라 값이 달라져야 하므로 n-i-1 처리해야함
            sum2 += arr[i][n-i-1];

            // answer에는 더 큰 값이 비교 후 저장됨
            answer = Math.max(answer, sum1);
            answer = Math.max(answer, sum2);
        }
        return answer;
    }

    //실행 메인 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main1 T = new Main1();
        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));
    }
}

2-10. 봉우리 | 어렵다 . . .

import java.util.Scanner;

/* 2-10. 봉우리
 *  [입력]
    첫 줄에 자연수 N이 주어진다.(2<=N<=50)
    두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 
    각 자연수는 100을 넘지 않는다.
    [출력] 봉우리 개수 출력 
 * */
public class Main2 {
    //상하좌우 인덱스 지칭 목적의 변수 두개 생성
    int [] dx = {-1, 0, 1, 0};
    int [] dy = {0, 1, 0, -1};
             //  상, 우, 하, 좌 
    //솔루션 함수 
    public int solution(int n, int[][]arr) {
        int answer = 0;    

        //각각의 arr[i][j] vs 상. 하,좌,우 비교해서 봉우리 카운팅
        for(int i = 0; i< n; i++) {
            for(int j = 0; j<n; j++) {
                //봉우리 판별
                boolean flag = true;

                //상하좌우 탐색용 dx, dy
                for(int k = 0; k<4; k++) {
                    int nx = i+dx[k]; //행 좌표
                    int ny = j+dy[k]; //열 좌표
                    //[경계 걸러내면서] 봉우리 아닌 경우 
                    if( nx>=0 && nx<n && ny  >=0 && ny <n && arr[nx][ny] >= arr[i][j]) {
                        flag = false;// f 주고
                        break;
                    }
                }
                //통과한 상태는 봉우리 맞으니까 카운팅 
                if(flag) answer++; //여기서 카운팅
            }
        }
        return answer;
    }

    //실행 메인
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main2 T = new Main2();
        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));
    }
}

2-11. 임시반장 정하기 | 어렵다 . . .

import java.util.Scanner;

/* 2-11번. 임시반장 정하기 
[입력]
첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지 나온다
[출력]
첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
여러 명이면 작은 번호 출력한다.
 * */
public class Main3 {
    //솔루션 함수
    public int solution(int n, int[][] arr) {
        int answer = 0, max = Integer.MIN_VALUE;
        //[기준] i번 학생 기준
        for(int i = 1; i<= n; i++) {
            int cnt=0; //매번 i와 같은 반 학생 카운팅용
            //[비교] j번 학생들
            for(int j = 1; j<=n; j++) {
                // 1~5 학년까지 돌면서 같은 반 누적하기
                for(int k = 1; k <=5; k++) {
                    // i 학생의 k 학년때 반이 == j 학생의 k학년때 반과 같다면 
                    if(arr[i][k] == arr[j][k]) {
                        cnt++; //누적
                        break;
                    }
                }
            }
            //가장 같은반 많이 했던 학생을 임시반장으로 선출 
            if(cnt > max) { //기존 max값보다 큰 경우 
                max=cnt;
                answer = i; //현재의 학생으로 임시반장 갱신 
            }
        }
        return answer;
    }
    //실행 메인 
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Main3 T = new Main3();

        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        //인덱스 1번부터 시작하게 배열 생성 
        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));
    }
}

2-12. 멘토링 | 어렵다 . . .

import java.util.Scanner;

/* 2-12. 멘토링 
[입력]
첫 번째 줄에 반 학생 수 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등을 의미합니다.
[출력]
첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.
*/
public class Main4 {
    //솔루션 함수
    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++;
                }
            }
        }
        return answer;
    }
    //실행 메인 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main4 T = new Main4();
        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.println(T.solution(n, m, arr));
    }
}
728x90