Java Solution for Forming a Magic Square Problem | HackerRank Problem
Problem Description :
We define a to be an n * n matrix of distinct positive integers from 1 to n^2 where the sum of any row, column, or diagonal of length n is always equal to the same number: the magic constant.
You will be given a 3 * 3 matrix of integers in the inclusive range [1, 9]. We can convert any digit 'a' to any other digit 'b' in the range [1, 9] at cost of |a - b|. Given s, convert it into a magic square at minimal cost. Print this cost on a new line.
In recreational mathematics, a square array of numbers, usually positive integers, is called a magic square if the sums of the numbers in each row, each column, and both main diagonals are the same.
There are 8 ways to make a 3×3 magic square. See below image for reference.
Example 1 :
Input :
5 3 4
1 5 8
6 4 2
Output :
7
8 3 4
1 5 9
6 7 2
This took three replacements at a cost of |5 - 8| + |8 - 9| + |4 - 7| = 3 + 1 + 3 = 7.
Example 2 :
Input :
4 8 2
4 5 7
6 1 6
Output :
4
4 9 2
3 5 78
1 6
This took three replacements at a cost of |9 - 8| + |3 - 4| + |8 - 6| = 1 + 1 + 2 = 4.
Solution 1 : Forming a Magic Square Solution in Java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FormingAMagicSquare {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rowSize = 3;
int colSize = 3;
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> arrRow = null;
System.out.println("insert data");
for (int i = 0; i < rowSize; i++) {
arrRow = new ArrayList<Integer>();
for (int j = 0; j < colSize; j++) {
arrRow.add(sc.nextInt());
}
list.add(arrRow);
}
System.out.println(formingMagicSquare(list));
}
public static int formingMagicSquare(List<List<Integer>> list) {
int[][] allMagicSquare = {
{ 4, 9, 2, 3, 5, 7, 8, 1, 6 },
{ 2, 7, 6, 9, 5, 1, 4, 3, 8 },
{ 6, 1, 8, 7, 5, 3, 2, 9, 4 },
{ 8, 3, 4, 1, 5, 9, 6, 7, 2 },
{ 2, 9, 4, 7, 5, 3, 6, 1, 8 },
{ 6, 7, 2, 1, 5, 9, 8, 3, 4 },
{ 8, 1, 6, 3, 5, 7, 4, 9, 2 },
{ 4, 3, 8, 9, 5, 1, 2, 7, 6 }
};
int minValue = Integer.MAX_VALUE;
for (int i = 0; i < allMagicSquare.length; i++) {
int total = 0;
// Check all Magic Square data with given array
for (int j = 0; j < allMagicSquare[i].length; j++) {
total = total + Math.abs(list.get(j / 3).get(j % 3) - allMagicSquare[i][j]);
}
if (total < minValue) {
minValue = total;
}
}
return minValue;
}
}
Solution Explanation :
- We have only 8 possibilities to create 3*3 square. So first initialize 2D array with all magic squares.
- Now create two loop, outer and inner. Outer for rows and inner for columns like (0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (1,0), (1,1), (1,2), (1,3) and so on until (8,8).
- We have 3*3 matrix as input, so we are checking all 9 values with given magic squares one by one and stores total changed value in total variable.
- Last if total is less then minValue then store total to minValue.
- Return minValue.
RECOMMENDED TUTORIALS :
- Create Nested ArrayList in Java
- Search target element in Rotated and Sorted Array in Java
- Mark and Toys Hacker Rank In Java
- Find First and Last Position of Element in Sorted Array with Explanation
Comments
Post a Comment