[Python] [Programmers] 행렬 테두리 회전하기(77485)

긍정왕·2021년 5월 26일
1

Algorithm

목록 보기
7/69
post-thumbnail

💡 문제 해결

  1. 먼저 1씩 증가하는 행렬을 생성
  2. 쿼리문의 값을 받아 테두리를 한칸씩 밀어내는 식으로 구현
  3. 한 칸씩 밀어내면서 리스트 안에 값을 누적
  4. 테두리를 회전시킨 뒤 누적된 리스트 안의 값 중 최소값을 return
  5. return된 최소값을 답에 추가


🧾 문제 설명

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

문제보기



🖨 입출력



📝 풀이

def create_arr(rows, columns):
    num = 0
    arr = [[0] * columns for _ in range(rows)]
    for i in range(rows):
        for j in range(columns):
            num += 1
            arr[i][j] = num
    return arr
	
    # 한 줄로 가능
    # return  board = [[i+(j)*columns for i in range(1,columns+1)] for j in range(rows)]


def rotate(arr, x1, x2, y1, y2):
    num_lst = [arr[x1 - 1][y1 - 1]]
    for i in range(y1, y2):
        num_lst.append(arr[x1 - 1][i])
        arr[x1 - 1][i] = num_lst[-2]
    for i in range(x1, x2):
        num_lst.append(arr[i][y2 - 1])
        arr[i][y2 - 1] = num_lst[-2]
    for i in range(y2 - 2, y1 - 2, -1):
        num_lst.append(arr[x2 - 1][i])
        arr[x2 - 1][i] = num_lst[-2]
    for i in range(x2 - 2, x1 - 2, -1):
        num_lst.append(arr[i][y1 - 1])
        arr[i][y1 - 1] = num_lst[-2]
    return arr, min(num_lst)

def solution(rows, columns, queries):
    answer = []

    arr = create_arr(rows, columns)

    for query in queries:
        x1, y1, x2, y2 = query
        arr, min_num = rotate(arr, x1, x2, y1, y2)
        answer.append(min_num)

    return answer

profile
Impossible + 땀 한방울 == I'm possible

0개의 댓글