본문 바로가기

알고리즘

Forming a Magic Square hackerrank 자바스크립트 번역 및 풀이

728x90

원문

We define a magic square to be an n x n matrix of distinct positive integers from 1 to n^2  where the sum of any row, column, or diagonal of length  is always equal to the same number: the magic constant.

You will be given a 3 x 3  matrix s 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.

Note: The resulting magic square must contain distinct integers in the inclusive range [1,9].

For example, we start with the following matrix s:

5 3 4

1 5 8

6 4 2

 

We can convert it to the following magic square:

8 3 4

1 5 9

6 7 2

 

This took three replacements at a cost of  [5-8]+[8-9]+[4-7] = 7.

 

Function Description

Complete the formingMagicSquare function in the editor below. It should return an integer that represents the minimal total cost of converting the input square to a magic square.

formingMagicSquare has the following parameter(s):

s : a 3 x 3 array of integers

 

 

번역

마방진은 n x n 행렬에서 각각의 위치의 양수가 1에서 n^2 사이이고, 모든 행과 , 대각선의 합이 항상 동일한 값을 가진다. 동일한 값을 마법상수라 한다.

1부터 9 사이에 정수값을 범위로 하는 3x3 행렬 s 주어진다.

우리는 어떤 숫자 a 1부터 9사이의 다른 b |a-b|((절대값) 만큼의 비용을 사용하여 변환할 있다.

주어진 s 통해 최소의 비용으로 마방진을 완성하라. 비용을 라인에 출력하라.

Note: 결과는 1부터 9 사이의 정수를 반드시 포함하고 있는 마방진이어야 한다.

 

예를들어, 아래 행렬 s 주어진다

5 3 4

1 5 8

6 4 2

 

 

 

우리는 아래 마방진으로 변환할 있다.

8 3 4

1 5 9

6 7 2

 

이렇게 변환하는데 드는 비용은 [5-8]+[8-9]+[4-7] = 7 이다.

(3 + 1 + 3)

 

함수 설명

아래 편집기에서 formingMagicSquare 함수를 완성하라.

행렬을 마방진으로 변환하기 위한 최소 비용의 합계를 리턴해야한다.

formingMagicSquare 다음의 파라미터를 가진다.

S : 3x3 정수배열

 

문제 해결 방법

어차피 마방진은 3x3이고 경우의 수가 8개밖에 안되므로 미리 만들어놓은 마방진과 비교해서

값을 구하는게 간단하고 빠르다.

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    // Complete the formingMagicSquare function below.
    function formingMagicSquare(s) {
            var arr = []
            arr.push([[8,3,4],[1,5,9],[6,7,2]]);
            arr.push([[4,3,8],[9,5,1],[2,7,6]]);
            arr.push([[6,1,8],[7,5,3],[2,9,4]]);
            arr.push([[2,9,4],[7,5,3],[6,1,8]]);
            arr.push([[2,7,6],[9,5,1],[4,3,8]]);
            arr.push([[6,7,2],[1,5,9],[8,3,4]]);
            arr.push([[4,9,2],[3,5,7],[8,1,6]]);
            arr.push([[8,1,6],[3,5,7],[4,9,2]]);
            
            var min = Number.MAX_VALUE;
            for(var i=0;i<8;i++){
                var minCost = 0;
                for(var j=0;j<3;j++){
                    for(var k=0;k<3;k++){
                        minCost +=Math.abs(arr[i][j][k]-s[j][k]);
                    }
                }
                if(min>minCost)
                    min=minCost;
            }
            return min;
    }
cs
728x90