본문 바로가기
Algorithms/문제 풀이

[HackerRank]Matrix Layer Rotation

by Coding_WONI 2022. 11. 30.

문제 링크입니다!

문제 이해

이번 문제는 이해하긴 쉽지만 implementation part에서 가장 어려운 문제입니다.

검색 없이 정말 오랫동안 고민하여 풀었습니다. 거의 하루 종일...ㅠ 걸렸습니다.

문제는 주어진 행렬의 r번의 회전 후에 행렬 값을 구하는 문제입니다.

 

INPUT

m: matrix의 행값

n: matrix의 열 값

r: 회전 횟수

matrix: matrix의 원소 값들

OUTPUT

r번 회전 후의 matrix의 값들

정리하면

조건 1. 행렬의 행과 열은 2 이상 300 이하이다.
조건 2. 회전 횟수 1 이상 109 이하 이다. 이 조건이 코드를 어렵게 만듭니다.
조건 3. 행과 열 값 중에 작은 값은 짝수이다. 이 조건은 있어서 다행?인 조건입니다.

이 조건 안 보고 풀다가 삽질했어요...

여기까지 문제에 대한 설명입니다.

다음은 문제 풀이에 도움이 되는 힌트?를 드리겠습니다.

.

.

.

.

.

.

.

.

.

문제 힌트

이 문제의 생각해야 할 경우는 조건 2입니다.

조건 2 때문에 r이 가장 큰 값을 가지면 행렬을 1번 회전하는 함수를 구현해도 시간이 너무 걸려서 TEST 9에서 FAIL을 가집니다.(참고로 TEST 9는 m, n, r 값이 300, 300, 999999999입니다.) 그래서 저는 어떻게 하면 r의 계산을 줄일 수 있을까 고민했습니다.

아래 제가 생각한 방법을 적었습니다. 보고 싶으신 분은 Drag 하세요!

원소의 기준으로 다시 자기 자리의 자리로 이동하면 굳이 회전을 할 필요가 없습니다. 예를 들어 a[i][j] 원소가 4번 이동하면 다시 자기 자리로 돌아온다면, r값으로 401 값이 들어오면 한 바퀴면 돌면 된다. 하지만 모든 원소가 값은 수를 가지고 있는 게 아니라서 각각의 수들이 어떤 조건에서 주기가 어떻게 바뀌는지 파악하면 주기로 나눈 나머지의 값만큼 회전시켜주면 합니다.

다음 생각해야 할 경우는 바로 행렬의 이동 조건을 찾는 것입니다. 행렬의 원소는 4가지의 방법으로 밖에 이동합니다. 상하좌우!입니다. 이 4개의 이동의 조건을 찾는 게 이 문제의 중요한 포인트입니다. 저는 최대한 그림을 그려서 규칙을 찾으려고 했습니다. 행값과 열 값이 다를 수 있지만 같은 경우인 쉬운 경우를 먼저 생각해서 풀어 보았습니다.

저는 많은 제출로 잘 작동하는지 확인하며 풀었습니다. 디버그라고 하죠?

다음은 저의 코드를 올리면서 마치겠습니다.

.

.

.

.

.

.

.

.

.

참고로 저는 파이썬을 이용하여 풀었습니다.

#!/bin/python3

import math
import os
import random
import re
import sys

#
# Complete the 'matrixRotation' function below.
#
# The function accepts following parameters:
#  1. 2D_INTEGER_ARRAY matrix
#  2. INTEGER r
#
def printmatrix(m, matrix):
    for i in range(m):
        for j in matrix[i]:
            print(j, end=' ')
        print('')


def matrixRotation(m, n, matrix, r):
    # Write your code here
    check = 2*n + 2*m - 4

    mat = matrix
    i = 0
    while(check > 0 and i < min(n, m)//2):
        times = r % check
        for _ in range(times):
            a = mat[i][i]
            b = mat[m-1-i][i]
            c = mat[m-1-i][n-1-i]
            d = mat[i][n-1-i]
            for j in range(1,n-2*i):
                mat[i][j+i-1] = mat[i][j+i]
            for j in range(n-2*i-1,0,-1):
                mat[m-i-1][j+i] = mat[m-i-1][j+i-1]
            for j in range(m-1-2*i-1,0,-1):
                mat[i+j+1][i] = mat[i+j][i]
            for j in range(1,m-1-2*i):
                mat[i+j-1][n-1-i] = mat[i+j][n-1-i]
            mat[i+1][i] = a
            mat[m-1-i][i+1] = b
            mat[m-2-i][n-1-i] = c
            mat[i][n-2-i] = d

        i += 1
        check -= 8

    printmatrix(m, mat)

if __name__ == '__main__':
    first_multiple_input = input().rstrip().split()

    m = int(first_multiple_input[0])

    n = int(first_multiple_input[1])

    r = int(first_multiple_input[2])

    matrix = []

    for _ in range(m):
        matrix.append(list(map(int, input().rstrip().split())))

    matrixRotation(m, n, matrix, r)

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

[Programmers]N-Queen  (1) 2024.07.31
[HackerRank] Weighted Uniform Strings  (0) 2022.12.01
[HackerRank]Two Characters  (0) 2022.12.01
[HackerRank]Climbing the Leaderboard  (0) 2022.11.30
[HackerRank]Drawing Book  (2) 2022.11.29