본문 바로가기
Coding Test/Python

[프로그래머스] 행렬 테두리 회전하기 Python Code

by giem 2022. 9. 1.
반응형

 

프로그래머스 행렬 테두리 회전하기를 파이썬으로 풀어보겠다.

 

이번 문제의 난이도는 레벨 2고 2021년 문제다.

 

예전 문제와 비교를 해보면 최신 문제가 확실히 약간 더 난이도가 있다.


문제

행렬의 일부분에서 테두리만 시계방향 회전시키는 문제이다.

회전시킬 때 가장 작은 값을 결과에 더해주면 된다.


구현

다른 방법은 생각나지 않았다.

정직하게 2차원 리스트를 생성하고

 

쿼리를 읽어서 그 리스트의 부분을 회전시키면서

min값을 찾도록 했다.


코드
import math
def solution(rows, columns, queries):
    arr = []
    for i in range(rows):
        temp=[]
        for j in range(columns):
            temp.append((j+1)+(i*columns))
        arr.append(temp)

    answer =[]
    for x1,y1,x2,y2 in queries:
        minval=math.inf
        temp=math.inf
        for i in range(y1-1, y2):
            temp, arr[x1-1][i] = arr[x1-1][i], temp
            minval = min(minval, temp)
        for j in range(x1, x2):
            temp, arr[j][y2-1] = arr[j][y2-1], temp
            minval = min(minval, temp)
        for k in range(y2-2, y1-2, -1):
            temp, arr[x2-1][k] = arr[x2-1][k], temp
            minval = min(minval, temp)
        for l in range(x2-2, x1-2, -1):
            temp, arr[l][y1-1] = arr[l][y1-1], temp
            minval = min(minval, temp)

        answer.append(minval)

    return answer

구현에서 쓴 것과 같이

 

위의 반복문에서 리스트를 생성하고

 

아래 반복문에서 min값을 찾으며 값을 치환하도록 처리하고

 

min값을 결과에 추가했다.


다른 풀이

 

 

로직은 비슷하지만 괜찮은 풀이가 있어서 가져와 봤다.

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

우선 인덱스 값들에 -1 처리를 해주어 코드를 깔끔하게 해 줬고

stack을 사용해서 값을 치환해주고

그 스택에서 min으로 깔끔하게 결과에 추가해준 부분 도 좋았다.

 

이 문제 자체가 뭔가 pythonic하게 풀기는 힘든 문제라

풀이 방식이 다들 비슷하게 되는 것 같다.

반응형

댓글