본문 바로가기

Coding Test/Programmers

[프로그래머스/파이썬] 행렬 테두리 회전하기

728x90

 

 

나의 풀이

def solution(rows, columns, queries):
    matrix = [[0] * columns for _ in range(rows)]
    answer = []
    for i in range(rows):
        for j in range(columns):
            matrix[i][j] = i * columns + j + 1

    for x1, y1, x2, y2 in queries:
        x, y = x1 - 1, y1 - 1
        temp = matrix[x][y]
        route = []

        for _ in range(y2 - y1):
            route.append(matrix[x][y])
            matrix[x][y], temp = temp, matrix[x][y]
            y += 1

        for _ in range(x2 - x1):
            route.append(matrix[x][y])
            matrix[x][y], temp = temp, matrix[x][y]
            x += 1

        for _ in range(y2 - y1):
            route.append(matrix[x][y])
            matrix[x][y], temp = temp, matrix[x][y]
            y -= 1

        for _ in range(x2 - x1 + 1):
            route.append(matrix[x][y])
            matrix[x][y], temp = temp, matrix[x][y]
            x -= 1

        answer.append(min(route))

    return answer

 

 

 

deque.rotate 를 이용한 풀이

from collections import deque
def solution(rows, columns, queries):
    arr = [[i+columns*j for i in range(1,columns+1)] for j in range(rows)]
    answer, result = deque(), []
    for i in queries:
        a,b,c,d = i[0]-1,i[1]-1,i[2]-1,i[3]-1
        for x in range(d-b):
            answer.append(arr[a][b+x])
        for y in range(c-a):
            answer.append(arr[a+y][d])
        for z in range(d-b):
            answer.append(arr[c][d-z])
        for k in range(c-a):
            answer.append(arr[c-k][b])
        answer.rotate(1)
        result.append(min(answer))
        for x in range(d-b):
            arr[a][b+x] = answer[0]
            answer.popleft()
        for y in range(c-a):
            arr[a+y][d] = answer[0]
            answer.popleft()
        for z in range(d-b):
            arr[c][d-z] = answer[0]
            answer.popleft()
        for k in range(c-a):
            arr[c-k][b] = answer[0]
            answer.popleft()
    return result

 

 

stack을 이용한 풀이

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

    board = [[i+(j)*columns for i in range(1,columns+1)] for j in range(rows)]
    # print(board)

    for a,b,c,d in queries:
        stack = []
        r1, c1, r2, c2 = a-1, b-1, c-1, d-1


        for i in range(c1, c2+1):

            stack.append(board[r1][i])
            if len(stack) == 1:
                continue
            else:
                board[r1][i] = stack[-2]


        for j in range(r1+1, r2+1):
            stack.append(board[j][i])
            board[j][i] = stack[-2]

        for k in range(c2-1, c1-1, -1):
            stack.append(board[j][k])
            board[j][k] = stack[-2]

        for l in range(r2-1, r1-1, -1):
            stack.append(board[l][k])
            board[l][k] = stack[-2]

        answer.append(min(stack))


    return answer
반응형