Skip to content

Latest commit

 

History

History
55 lines (45 loc) · 3.78 KB

풀이_행렬테두리회전하기.md

File metadata and controls

55 lines (45 loc) · 3.78 KB

🥭 프로그래머스 행렬 테두리 회전하기

  • Date : 2021.05.09(일)
  • Time : 30분

문제

  • rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
    x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
    
    행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • rows는 2 이상 100 이하인 자연수입니다.
  • columns는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    • 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
  • queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
    • x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    • 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.



코드 풀이

    for x1,y1,x2,y2 in queries:
        tmp = array[x1-1][y1-1]
        mini = tmp

        for k in range(x1-1,x2-1):
            test = array[k+1][y1-1]
            array[k][y1-1] = test
            mini = min(mini, test)

: 값을 하나씩 당겨줘야한다. 회전을 한칸씩 직접 시켜주는 것이다! queries에는 x1,y1,x2,y2가 들어있기 때문에 for문을 통해 입력시켜준다. 제일 먼저 왼쪽 세로부터 시작을 해준다. 하나의 값을 다른 하나의 값으로 옮기는 과정을 반복해야한다. 왼쪽 세로는 y 값은 y1-1 로 고정을 시켜주고 x값을 한칸씩 증가시켜줬다. 이때 회전을 실행했을 때 최소값을 저장해야하기 때문에 min() 함수를 이용해 더 작은 값을 저장해둔다. 여기서 tmp를 왜 array[x1-1][y1-1]로 잡았는가는 array[x1-1][y1-1]값은 array[x-1][y1]로 이동을 해줘야하는 값인데 이 for문에서는 왼쪽 세로 부분이기 때문에 상단 가로 for문이 돌아갈 때 옮겨주는 값이다. 하지만 현재 값을 옮기면서 array[x-1][y-1]값이 다른 값으로 대체되기 때문에 그 값을 저장해서 마지막에 넣어주기 위해 가지고 있는 것이다.

    for k in range(y1-1,y2-1):
        test = array[x2-1][k+1]
        array[x2-1][k] = test
        mini = min(mini, test)

: 이번 for문은 하단 가로부분이다. 역시 위와 마찬가지로 값을 땅겨주고 작은 값을 mini에 저장해둔다. 이렇게 4부분 모두 for문으로 완료한다.

    array[x1-1][y1] = tmp
    answer.append(mini)

: 그리고 위에 말했던 것처럼 처음 중심이 되었던 값을 위치에 넣어주고 마무리해준다. 그리고 이번 회전에서 가장 작은 값을 answer에 넣어주면 한 회전이 끝이난다.