2021 Dev-Martching:Webバックエンド開発者(上半期):回転マトリクス枠-解Python 3


質問の表示 👈 クリック!

💡 に答える


✔確定問題

  • 数字を順番に書くマトリクスがあります.複数の矩形範囲[x 1,y 1,x 2,y 2]を含むクエリーを受け入れます.行列上に矩形をqueryの要素順にスナップし、枠線に存在する数字だけが時計回りに移動します.最小値を返します.

  • 1回目の移動その状態で変わらない2回目の移動...なお、この状態でn回目の移動を行い、すべての移動の数字の中で最小の値を返す.
  • 解✔方法
    宣言
  • 位置をキー値、位置の数字を値とするディクソンデータボード
    ex) board[(1,1)] = 1 , board[(1,2)] = 2 .. ,board[(rows, colunms)] = rows*colunms

  • 開始位置start=(i,j)は左上隅です.右、下、左、上から長方形を描き、数値を1つずつ移動します.

    右:私は相変わらずです.j増加ごとに1
    以下:jやはり.i増加1
    左:相変わらずです.jマイナス1
    上:jは相変わらずです.iマイナス1
    次の値を開始位置の値とスワップし、セルを移動し続けます.交換のたびにmin関数を使用して最大値を更新します.
  • 💡 完全なソースコード

    def solution(rows, columns, queries):
        answer = []
        
        board, num = dict(), 1
        for i in range(rows):   #board[(위치)] = 위치에 있는 숫자
            for j in range(columns):
                board[(i+1, j+1)] = num
                num += 1
                
        for x1, y1, x2, y2 in queries:
            start = (i, j) = (x1, y1) #첫 시작 위치
            min_num = board[start]  #최솟값 
            for n in [1, -1]:
                for cnt in range(y2-y1):
                    j += n
                    board[start], board[i, j] = board[i, j],  board[start]
                    min_num = min(min_num, board[start])
                for cnt in range(x2-x1):
                    i += n
                    board[start], board[i, j] = board[i, j], board[start]
                    min_num = min(min_num, board[start])
            answer.append(min_num)
        
        return answer