Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - How to Solve this 2D Array Hour Glass?

I am working on a problem where I've to print the largest sum among all the hourglasses in the array. You can find the details about the problem here-

What I tried:

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[][] = new int[6][6];
        for (int arr_i = 0; arr_i < 6; arr_i++) {
            for (int arr_j = 0; arr_j < 6; arr_j++) {
                arr[arr_i][arr_j] = in.nextInt();
            }
        }

        int sum = 0;
        int tmp_sum = 0;
        for (int arr_i = 0; arr_i < 4; arr_i++) {
            for (int arr_j = 0; arr_j < 4; arr_j++) {
                if (arr[arr_i][arr_j] > 0) {
                    sum = sum + (arr[arr_i][arr_j]) + (arr[arr_i][arr_j + 1]) + (arr[arr_i][arr_j + 2]);
                    sum = sum + (arr[arr_i + 1][arr_j + 1]);
                    sum = sum + (arr[arr_i + 2][arr_j]) + (arr[arr_i + 2][arr_j + 1]) + (arr[arr_i + 2][arr_j + 2]);
                    if (tmp_sum < sum) {
                        tmp_sum = sum;
                    }
                    sum = 0;
                }
            }
        }
        System.out.println(tmp_sum);
    }
}

Input:

1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 9 2 -4 -4 0
0 0 0 -2 0 0
0 0 -1 -2 -4 0

Output:

12

Expected Output:

13

Screenshot: enter image description here

I don't know where I'm doing wrong. I cannot understand why the expected output is 13. According to the description given in the problem it should be 10. Is this a wrong question or my understanding about this is wrong?

like image 692
RajSharma Avatar asked May 21 '16 13:05

RajSharma


2 Answers

Remove the if (arr[arr_i][arr_j] > 0) statement. It prevents finding the answer at row 1, column 0, because that cell is 0.

Comments for other improvements to your code:

  • What if the best hourglass sum is -4? You should initialize tmp_sum to Integer.MIN_VALUE. And name it maxSum, to better describe it's purpose.

  • You shouldn't define sum outside the loop. Declare it when it is first assigned, then you don't have to reset it to 0 afterwards.

  • Your iterators should be just i and j. Those are standard names for integer iterators, and keeps code ... cleaner.
    If you prefer longer names, use row and col, since that is what they represent.

  • You don't need parenthesis around the array lookups.

  • For clarity, I formatted the code below to show the hourglass shape in the array lookups.

Scanner in = new Scanner(System.in);
int arr[][] = new int[6][6];
for (int i = 0; i < 6; i++){
    for (int j = 0; j < 6; j++){
        arr[i][j] = in.nextInt();
    }
}

int maxSum = Integer.MIN_VALUE;
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
        int sum = arr[i    ][j] + arr[i    ][j + 1] + arr[i    ][j + 2]
                                + arr[i + 1][j + 1]
                + arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];
        if (maxSum < sum) {
            maxSum = sum;
        }
    }
}
System.out.println(maxSum);
like image 179
Andreas Avatar answered Sep 28 '22 01:09

Andreas


This was my solution. I wrapped an if statement around the code that calculates the sum, that makes sure we don't go out of bounds.

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int arr[][] = new int[6][6];
    int max = Integer.MIN_VALUE;
    int tempMax = 0;

    for(int i=0; i < 6; i++){
        for(int j=0; j < 6; j++){
            arr[i][j] = in.nextInt();
        }
    }

    for(int i=0; i < 6; i++){
        for(int j=0; j < 6; j++){
            if (i + 2 < 6 && j + 2 < 6) {
                tempMax += arr[i][j] + arr[i][j + 1] + arr[i][j + 2];
                tempMax += arr[i + 1][j + 1];
                tempMax += arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];

                if (max < tempMax) {
                    max = tempMax;
                } 

                tempMax = 0;
            }           
        }
    }

    System.out.println(max);
}
like image 43
sean le roy Avatar answered Sep 28 '22 01:09

sean le roy