230125 Forming a Magic Square

샨티(shanti)·2023년 1월 25일
0

코딩테스트

목록 보기
24/35
post-thumbnail
post-custom-banner

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

계속 프로그래머스 문제로 푸는 것에 한계를 느끼기도 했고, 모든 기업에서 프로그래머스 형태로만 코테를 보는 것은 아니기에 오늘은 다른 사이트에서 코테를 풀어보았다.

찾아보니 Leetcode도 있는 것 같고 HackerRank도 있는 것 같던데 오늘은 후자.

결론적으론 medium 레벨의 문제를 한시간 정도 잡고 늘어졌는데 풀지 못했다.
풀 수 있을까? 라는 생각으로 반신반의 하며 문제를 켰는데 우선 문제를 해석하는 데만 꽤 오랜 시간을 투입했고 문제를 풀지 못했던 결정적인 이유 역시 해석을 제대로 하지 못한 점이었다.

마방진 문제인데...
여러 해설들을 보더라도 '이렇게 푸는게 맞아?' 하는 약간의 짜증이 올라오기도..ㅎ
여튼 오늘 문제를 풀지는 못했지만 더 오랜 시간 지체할 수 없기에 간단하게 블로그에 해설글을 요약하고 마무리짓는다.
요즘 코테도, 과제도 너무 못해서 약간 마음이 꺾였는데... 다시 붙잡고 끌어올리는 수밖에.

개발 공부를 하면서 너무 큰 좌절감을 수시로 맛보는 것 같아 의욕이 좀 떨어진다.
다들 그럴까..? ㅎㅎ


문제 링크

Magic Square Forming


해설

  • 다 풀고나서 알았다... 마방진 문제라는 것.
  • 사실 테스트케이스로 주어진 2개의 케이스만 통과시키려 갖은 애를 쓴 것 같은데 결론적으론 스물 몇개의 테스트 중 단 서너 개만 통과시킬 수 있는 function을 만들었던 것.
  • 마방진을 제대로 이해했더라면 아마 가로, 세로, 대각선 숫자들의 합이 모두 동일하다는 점을 인지했을텐데 그걸 모르고 끙끙 앓아대니 function을 만들어놓고도 해결하지 못할 수 밖에.

3x3 마방진의 갯수는 한정적이라고 한다. 총 8개의 정해져있는 행렬밖에는 만들어낼 수 없다는 점.
따라서 8개의 마방진을 알고 있었던 사람이라면 사실 이 8개의 마방진을 나타내는 행렬을 통해 리턴해야 하는 숫자가 가장 최소인 경우의 수를 찾아내는 방식으로 풀 수 있었을 것이라고 본다.

하지만 나는 마방진도 모르는 마당에 문제까지 잘못 해석했으니;;

해설을 포함한 원본 블로그의 출처를 남기고 아래와 같이 소스코드를 포함한다.

function formingMagicSquare(s) {
    // Write your code here
    
    const standard = [];
    
    standard.push([[8,3,4],[1,5,9],[6,7,2]]);
    standard.push([[4,3,8],[9,5,1],[2,7,6]]);
    standard.push([[6,1,8],[7,5,3],[2,9,4]]);
    standard.push([[2,9,4],[7,5,3],[6,1,8]]);
    standard.push([[2,7,6],[9,5,1],[4,3,8]]);
    standard.push([[6,7,2],[1,5,9],[8,3,4]]);
    standard.push([[4,9,2],[3,5,7],[8,1,6]]);
    standard.push([[8,1,6],[3,5,7],[4,9,2]]);
    
    let min = Number.MAX_VALUE;
    
    for (let i = 0; i < 8; i += 1) {
        let minCost = 0;
        
        for (let j = 0; j < 3; j += 1) {
            for (let k = 0; k < 3; k += 1) {
               minCost += Math.abs(standard[i][j][k] - s[j][k]); 
            }
        }
        if (min > minCost) {
            min = minCost;
        }
    }
    
    return min;
}

자바스크립트에서 표현할 수 있는 가장 큰, 최대 숫자값은 Number.MAX_VALUE와 같이 표현 가능하다고 한다. 이번에 처음 알았음!

이렇게 표현된 값을 min으로 두고, 마방진으로 결정되어 있는 3x3 행렬과 입력값 s의 각 값들의 차를 비교하면서 최소값을 구해나가는 과정이라고 볼 수 있다.

마방진을 알고 모르고를 떠나서 어쨌든간에 주어진 문제는 풀어내야 하는 숙명을 가진 인간이기에 (ㅠㅠㅋ) 내일도 어김없이 코딩테스트 가즈아!

profile
가벼운 사진, 그렇지 못한 글
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 3월 3일

230125 Forming a Magic Square refers to a mathematical puzzle or game in which a 3x3 grid of numbers is arranged so that the sum of each row, column, and diagonal is the same. Here you get Corporate magician and learn more new ways for magician services. This sum is known as the magic constant. The puzzle is solved by finding the correct arrangement of the numbers to achieve this goal. This type of puzzle has been known since ancient times and is still popular today as a recreational and educational activity.

답글 달기