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

곌로그·2023년 4월 27일
0

[python]코딩테스트

목록 보기
8/34
post-thumbnail

문제 링크


문제 요약

퍼즐 처럼(?) 생각하면 쉽게 이해가 될지도 모르겠다.
input으로 행과 열이 주어지고 query들이 주어지는데 행1 열1 행2 열2 순서로 주어진다. query들은 테두리가 되고 테두리에 해당하는 요소들은 전부 시계방향으로 회전시킨다.
그리고 마지막으로 회전시킨 요소들 중 가장 작은 값을 반환하면 된다.


문제 풀이

def solution(rows, columns, queries):
    answer = []
    
    #matrix 0으로 초기화
    matrix = [ [0] * columns for i in range(rows)]
    num = 1
    for i in range(rows):
        for j in range(columns):
            matrix[i][j] = num
            num +=1
    #print(matrix)

    for q in queries:
        #index로 접근하기 위해서 query로 들어온 값에 -1을 해주어 저장
        r1, c1, r2, c2 = [q[i] -1 for i in range(len(q))]
        if r1 == 1 and r2 == rows-1 and c1 == 1 and c1 == columns-1:
            answer.append(1)
            return answer
        else:
        
        # 1, 1, 4, 3
            #가장 위의 값 저장
            minValue = []
        
            tmp = matrix[r1][c1]
        
            #left
            for idx in range(r1, r2):
                #위로 한 칸 씩 이동
                minValue.append(matrix[idx][c1])
                matrix[idx][c1] = matrix[idx+1][c1]
            #print(matrix)
            #bottom
            for idx in range(c1, c2):
                #왼쪽으로 한 칸 씩 이동
                minValue.append(matrix[r2][idx])
                matrix[r2][idx] = matrix[r2][idx+1]
            #print(matrix)
            #right
            for idx in range(r2, r1, -1):
                #아래로 한 칸 씩 이동
            
                minValue.append(matrix[idx][c2])
                matrix[idx][c2] = matrix[idx-1][c2]
    
            for idx in range(c2,c1, -1):
            #오른쪽으로 한 칸 씩 이동
                minValue.append(matrix[r1][idx])
                matrix[r1][idx] = matrix[r1][idx-1]

        
            matrix[r1][c1+1] = tmp
            # print(matrix)
            # print("====")
            answer.append(min(minValue))


    return answer

📌 고려해야할 점

위 그림의 분홍색 박스가 쳐진 테두리 부분들을 회전한다고 해보자. 이때, 시작점을 8로 잡고 회전할 것이기 때문에 8은 위의 코드에서처럼 tmp라는 변수에 저장해둔다.
이제 left, bottom, right, top 순서대로 이동시켜보자.

[ Left 이동 & Bottom 이동]

위의 왼쪽 그림에서 8이 없어졌다고 가정하고 빈 공간으로 파란색으로 구분된 [14,20,26]을 차례로 밀어본다고 생각하자. 결과적으로 오른쪽 그림과 같이 옮겨지게 될 것이고 원래 26이 있던 자리는 빈 공간이 되고 이제 bottom에 해당하고 연두색으로 구분 된 [27,28]을 왼쪽으로 밀 수 있다.

[ Right 이동 & Top 이동]

위의 왼쪽 그림에서 연두색으로 구분된 [27,28]이 이동된 것을 확인할 수 있다. 따라서, 원래 28이 있던 자리는 빈공간이 되므로 right에 해당하는 숫자들이 이동할 수 있다. 오렌지색으로 구분된 [10,16,22]는 한 칸 아래로 이동하게 될 것이다.
그 결과는 오른쪽 그림에 해당하며 원래 있던 10의 자리는 빈 자리가 된다. 마지막으로 노란색 박스에 해당하는 [9] (Top에 해당) 가 오른쪽으로 이동할 수 있게 된다.

[ 마지막 정리 ]

이제 마지막으로 Top의 이동까지 마무리되면 원래 9가 있던 자리는 빈 자리가 될 것이고 이 자리는 우리가 가장 맨 처음에 tmp에 저장한 8 값을 저장해주면 된다.

물론 실제 코드에서는 원래 자리에 있던 숫자를 덮어쓰고 덮었는 과정이다. 내가 이 문제를 해결하기 위해서는 위의 과정들의 방법을 활용하였음을 참고하여 문제 해결을 하면 좋을 것 같다.

0개의 댓글