본문 바로가기
Coding Test

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

by 쌩욱 2021. 10. 24.

문제 설명

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
  • 행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

풀이

구현 문제입니다. 회전 목록으로 반복문을 돌리며 한 단계씩 수행해 최소값을 찾았습니다.

최소값은 매 단계마다 set에 회전한 숫자를 넣고 최소값을 찾아서 정답에 추가했습니다.

회전하는 방법은 시계 방향으로 회전해야하기 때문에 반시계 방향으로 현재 원소와 다음 원소를 스왑해주며 한 바퀴를 돌고 마지막에는 반복문 횟수를 하나 줄여주면 결과적으로 시계방향으로 한칸씩 회전한 모습이 됩니다.

전체 코드입니다.

 

처음 붙잡고 가는 원소를 한 바퀴 뺑 돌려 여행시켜주는 느낌으로 꼬우

 

def solution(rows, columns, queries):
    answer = []
    graph = [[] for _ in range(rows)]
    cnt = 1

    for i in range(rows):
        for j in range(columns):
            graph[i].append(cnt)
            cnt+=1

    for x1,y1,x2,y2 in queries:
        x1 -= 1
        y1 -= 1
        x2 -= 1
        y2 -= 1
        mins = []

        # 윗변
        for y in range(y2, y1, -1):
            graph[x1][y-1], graph[x1][y] = graph[x1][y], graph[x1][y-1]
            mins.append(graph[x1][y-1])
            mins.append(graph[x1][y])
        #왼쪽 변
        for x in range(x1,x2):
            graph[x][y1], graph[x+1][y1] = graph[x+1][y1], graph[x][y1]
            mins.append(graph[x][y1])
            mins.append(graph[x+1][y1])

        #아래 변
        for y in range(y1, y2):
            graph[x2][y], graph[x2][y+1] = graph[x2][y+1], graph[x2][y]
            mins.append(graph[x2][y])
            mins.append(graph[x2][y+1])

        #오른쪽 변
        #마지막 반복문에서 for문 도는 횟수를 1 줄여서 회전을 완성시킨다.
        for x in range(x2, x1+1, -1):
            graph[x][y2], graph[x-1][y2] = graph[x-1][y2], graph[x][y2]
            mins.append(graph[x][y2])
            mins.append(graph[x-1][y2])

        # for i in range(len(graph)):
        #     print(graph[i])
        #
        # print("--------------")
        mins = set(mins)
        minNum = min(mins)
        answer.append(minNum)

    return answer