make a splash
article thumbnail
728x90

문제

주어진 3*3 행렬은 1~9의 수를 가진다.

절댓값의 cost가 작은 수로 행렬의 수를 바꿀 수 있다. cost의 최솟값을 출력하자.

 

풀이

입력받은 행렬을 하나하나씩 비교하여 절댓값을 계산하려다가, magic matrix의 중간값은 5뿐이며, 절댓값이 최소가 되려면 (1,9),(2,8),(3,7),(4,6)의 조합을 중간의 5 주위로 배열해야한다는 것을 알았다.

홀수 조합이 첫째 줄에 오는 경우는 불가능하기 때문에 짝수 조합들이 첫째 줄에 오는 방향을 생각했고, 가능한 3*3 행렬은 8가지 경우 였다.

8가지 경우의 행렬을 제시하고 입력받은 행렬과 비교하여 가장 절댓값의 크기가 작은 수를 리턴한다.

 

코드

<c++ />
int formingMagicSquare(int s_rows, int s_columns, int** s) { int magic_mat[8][3][3] = { // 가능한 magic matrix {{8, 1, 6}, {3, 5, 7}, {4, 9, 2}}, {{6, 1, 8}, {7, 5, 3}, {2, 9, 4}}, {{4, 9, 2}, {3, 5, 7}, {8, 1, 6}}, {{2, 9, 4}, {7, 5, 3}, {6, 1, 8}}, {{8, 3, 4}, {1, 5, 9}, {6, 7, 2}}, {{4, 3, 8}, {9, 5, 1}, {2, 7, 6}}, {{6, 7, 2}, {1, 5, 9}, {8, 3, 4}}, {{2, 7, 6}, {9, 5, 1}, {4, 3, 8}}, }; int A[3][3]; // 저장할 배열 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) A[i][j] = s[i][j]; } int min_cost = 81; for (int k = 0; k < 8; k++) { // 가능한 행렬과 비교 int crt_cost = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) crt_cost += abs( A[i][j] - magic_mat[k][i][j] ); // 절댓값을 비교하여 더함 } if (crt_cost < min_cost) // cost가 가장 작은 수 저장 min_cost = crt_cost; } return min_cost; }

 

결과

 

728x90
반응형

'문제풀이 > C' 카테고리의 다른 글

[Hackerrank] Viral Advertising  (0) 2020.11.23
[HackerRank] Find Digits  (0) 2020.11.22
[Hackerrank] Bill Division  (0) 2020.11.19
[Hackerrank] Electronics Shop  (0) 2020.11.19
[Hackerrank] Compare the Triplets  (0) 2020.11.18
profile

make a splash

@vision333

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!