뱁새유니버스

[알고리즘4] 2차원배열 주어진 좌표를 포함한 상하좌우 합이 최대인 좌표 찾기 문제

by 뱁새유니버스

IT

행렬의 크기를 입력받고 행렬의 값을 Random으로 0부터 100까지 주어서 임의의 2차원 배열을 만듭니다.

2차원 배열을 갖고 그 안에서 행렬 특정 좌표값을 포함한 상하좌우값의 합이 가장 큰 특정좌표를 구하는 문제인데요.

이번엔 코드 복잡성을 고려해 main 메서드뿐만 아니라 getSumAroundPoint메서드를 만들어 코드의 가독성과 재사용성을 높였습니다.

자세한 코드는 아래와 같습니다.

package algorithm;

import java.util.Random;
import java.util.Scanner;

public class Main {
    // Scanner 객체를 이용해 사용자로부터 입력을 받습니다.
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        // 사용자로부터 행렬의 크기를 입력받습니다.
        int a = sc.nextInt();
        int b = sc.nextInt();

        // 입력받은 크기로 2차원 배열을 초기화합니다.
        int[][] arr = new int[a][b];

        // 랜덤한 숫자를 생성하기 위해 Random 객체를 사용합니다.
        Random random = new Random();
        for (int i = 0; i < a; i++) {
            for (int j = 0; j < b; j++) {
                // 각 배열 원소에 0~99 사이의 랜덤한 숫자를 할당합니다.
                arr[i][j] = random.nextInt(100);
                // 현재 배열 원소의 값을 출력합니다.
                System.out.print(arr[i][j] + " ");
            }
            // 한 행의 출력이 끝나면 줄바꿈을 합니다.
            System.out.println();
        }

        // 최대 합을 찾기 위한 변수를 초기화합니다.
        int maxSum = Integer.MIN_VALUE;
        int maxRow = -1;
        int maxCol = -1;
        for (int i = 0; i < a; i++) {
            for (int j = 0; j < b; j++) {
                // 현재 좌표를 중심으로 상하좌우 및 자기 자신의 합을 계산합니다.
                int currentSum = getSumAroundPoint(i, j, arr);
                // 현재 합이 이전 최대 합보다 크다면 값을 갱신합니다.
                if (currentSum > maxSum) {
                    maxSum = currentSum;
                    maxRow = i;
                    maxCol = j;
                }
            }
        }

        // 최대 합을 가진 좌표와 그 합을 출력합니다.
        System.out.println("최대 합을 가진 좌표: (" + maxRow + ", " + maxCol + ")");
        System.out.println("해당 좌표의 합: " + maxSum);
    }

    // 주어진 좌표를 중심으로 상하좌우 및 해당 좌표의 합을 반환하는 메서드입니다.
    private static int getSumAroundPoint(int row, int col, int[][] arr) {
        // 상하좌우 및 자기 자신의 좌표 변화량입니다.
        int[] dr = {-1, 1, 0, 0, 0};
        int[] dc = {0, 0, -1, 1, 0};

        int sum = 0;
        // 5가지 방향에 대해 반복합니다.
        for (int i = 0; i < dr.length; i++) {
            int newRow = row + dr[i];
            int newCol = col + dc[i];
            // 새로운 좌표가 배열 범위 내에 있을 경우만 합에 추가합니다.
            if (newRow >= 0 && newRow < arr.length && newCol >= 0 && newCol < arr[0].length) {
                sum += arr[newRow][newCol];
            }
        }
        return sum;
    }
}

결과값은 다음과 같습니다.

5X5 2차원 배열을 만들고 임의의 값들로 채워넣고 특정좌표 및 상하좌우 값의 합이 가장 큰 값을 찾습니다.

 

반응형

블로그의 정보

가슴이 웅장해지는 모든것

뱁새유니버스

활동하기