[Easy] 1886. Determine Whether Matrix Can Be Obtained By Rotation

문제

Given two n x n binary matrices mat and target, return true if it is possible to make mat equal to target by rotating mat in 90-degree increments, or false otherwise.

 

두 개의 n x n 이진 행렬 매트와 타겟이 주어지면 매트를 90도 단위로 회전시켜 표적으로 동일하게 만들 수 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

예시

Example 1:

Input: mat = [[0,1],[1,0]], target = [[1,0],[0,1]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise to make mat equal target.

Example 2:

Input: mat = [[0,1],[1,1]], target = [[1,0],[0,1]]
Output: false
Explanation: It is impossible to make mat equal to target by rotating mat.

Example 3:

Input: mat = [[0,0,0],[0,1,0],[1,1,1]], target = [[1,1,1],[0,1,0],[0,0,0]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise two times to make mat equal target.

 

제약 조건

Constraints:

  • n == mat.length == target.length
  • n == mat[i].length == target[i].length
  • 1 <= n <= 10
  • mat[i][j] and target[i][j] are either 0 or 1.

 

해결 과정

  • width와 height를 설정한다.  이때 mat와 target의 width, height는 동일하다.
  • matrix를 90도로 돌린다면 총 4가지의 경우의 수가 있다. 경우의 수들에 대한 변수를 만든다. 
  • 이중 for문을 돌며 matrix와 target 요소에 접근한다.
    • mat[i][j]와 target[i][j]와 비교하는 것은 90도로 돌아가지 않은, 제자리에서 비교하는 것이다.
      • 만약 값이 같지 않다면 normal에 false를 할당한다.
    • mat[i][j]와 taret[j][width-1-i]를 비교하는 것은 90도로 한 번 돌아간 것과 비교하는 것이다.
      • 만약 값이 같지 않다면 rightOneTime에 false를 할당한다.
    • mat[i][j]와 taret[height-1-i][width-1-j]를 비교하는 것은 90도로 두 번 돌아간 것과 비교하는 것이다.
      • 만약 값이 같지 않다면 rightTwoTime에 false를 할당한다.
    • mat[i][j]와 taret[height-1-j][i]를 비교하는 것은 90도로 세 번 돌아간 것과 비교하는 것이다.
      • 만약 값이 같지 않다면 rightThreeTime에 false를 할당한다.
  • normal, rightOneTime, rightTwoTime, rightThreeTime 중 하나라도 true가 있다면 true를 반환한다.

 

해결 코드

/**
 * @param {number[][]} mat
 * @param {number[][]} target
 * @return {boolean}
 */
var findRotation = function(mat, target) {
    let width = mat[0].length;
    let height = mat.length;
    
    let normal = true;
    let rightOneTime = true;
    let rightTwoTimes = true;
    let rightThreeTimes = true;
    
    for (let i = 0; i < height; i++)  {
        for (let j = 0; j < width; j++) {
            // don't rotate mat
            if (mat[i][j] !== target[i][j]) {
                normal = false;
            }
            
            // rotate mat right 1 time
            if (mat[i][j] !== target[j][width - 1 - i]) {
                rightOneTime = false;
            }
            
            // rotate mat right 2 times
            if (mat[i][j] !== target[height - 1 - i][width - 1 - j]) {
                rightTwoTimes = false;
            }
            
            // rotate mat right 3 times
            if (mat[i][j] !== target[height - 1 - j][i]) {
                rightThreeTimes = false;
            }
        }
    }
    
    return normal || rightOneTime || rightTwoTimes || rightThreeTimes;
};

'leetCode' 카테고리의 다른 글

[Medium] 973. K Closest Points to Origin  (0) 2022.07.01
[Medium] Spiral Matrix  (0) 2022.07.01
[Medium] Rotate Image  (0) 2022.06.30
[Easy] 58. Length of Last Word  (0) 2022.06.17
[Medium] 739. Daily Temperatures  (0) 2022.06.17