Arrays - 2D Array -DS [Easy]

 https://ithelp.ithome.com.tw/articles/10199983

要計算出所謂的 hourglass (沙漏) 的總和

目的

那我們就是要寫一個方法, 來找出最大 hourglass

輸入限制

  • input 會是個 6*6 的二維陣列
  • 陣列中每個元素的值介於 9 ~ -9
  • 解題概念:

    由此題我們可以觀察到 hourglass (沙漏)的圖形

    a b c
      d
    e f g
    

    其實是...
    top : 3 個元素 a b c
    middle : 中間一個元素 d
    buttom : 3 個元素 e f g

    所以其實我們只要這樣把 a ~ g 都加起來就對了

  • 也就是如下
    假定陣列是 arr[6][6] 6*6的二維陣列
    那我們要算的其實就是

    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]
    

    這樣的 hourglass sum (沙漏和)

  • 另外 由於

    a b c
      d
    e f g
    

    在這樣的圖形中, 其實只有 7 個值,
    陣列中每個元素的值介於 9 ~ -9
    所以我們可以知道 最小的 hourglass sum 會是 7 * -9 = -63
    所以可以把 -63 當作一個初始的基準值
    只要算出的 hourglass sum 比之前算出的大, 我們就以這個最大的 hourglass sum 為答案

  • 程式碼

    package hourglass;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Scanner;
    
    public class Solution {
    
    
    	// Complete the hourglassSum function below.
    	static int hourglassSum(int[][] arr) {
    		int max = 7 * -9;
    
    		for(int i = 0; i < 6; i++) {
    			for(int j = 0; j < 6; j++) {
    				if((i+2) < 6 && (j+2) < 6) { // 避免 outbound of index
    					int top = arr[i][j] + arr[i][j+1] + arr[i][j+2];
    					int middle = arr[i+1][j+1];
    					int bottom = arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2];
    					int sum = top + middle + bottom;
    					if(sum > max) {
    						max = sum;
    					}
    
    				}
    			}
    		} 
    		return max;
    	}
    
    	private static final Scanner scanner = new Scanner(System.in);
    
    	public static void main(String[] args) throws IOException {
    		BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
    
    		int[][] arr = new int[6][6];
    
    		for (int i = 0; i < 6; i++) {
    			String[] arrRowItems = scanner.nextLine().split(" ");
    			scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
    
    			for (int j = 0; j < 6; j++) {
    				int arrItem = Integer.parseInt(arrRowItems[j]);
    				arr[i][j] = arrItem;
    			}
    		}
    
    		int result = hourglassSum(arr);
    
    		bufferedWriter.write(String.valueOf(result));
    		bufferedWriter.newLine();
    
    		bufferedWriter.close();
    
    		scanner.close();
    	}
    }
    
    
    

    以上是今天的解題分享! 感謝!

留言

這個網誌中的熱門文章

考績被打差了 輕率離職會更傷

Arrays - DS (Reverse array) [Easy]

WireMock