bong-u/til

프로그래머스 - 행렬 테두리 회전하기 (L2)

수정일 : 2023-08-24

 1dx = [1, 0, -1, 0]
 2dy = [0, 1, 0, -1]
 3
 4def solution(rows, columns, queries):
 5    table = [[(j*columns)+i+1 for i in range(columns)] for j in range(rows)]
 6    answer = []
 7
 8    for y1, x1, y2, x2 in queries:
 9        min_num = 10000
10        x1 -= 1
11        y1 -= 1
12        x2 -= 1
13        y2 -= 1
14        direction = 0
15        curX, curY = x1, y1
16        postNum = table[y1][x1]
17        while True:
18            curX = curX+dx[direction]
19            curY = curY+dy[direction]
20
21            temp = table[curY][curX]
22            table[curY][curX] = postNum
23            postNum = temp
24
25            min_num = min(min_num ,postNum)
26
27            if ((curX == x2 and curY == y1) or
28                (curX == x2 and curY == y2) or
29                (curX == x1 and curY == y2)):
30                direction += 1
31            
32            if curX == x1 and curY == y1:
33                break
34
35        answer.append(min_num)
36
37    return answer

문제

  • rows X columns 크기의 행렬이 있다
  • 행렬에는 1부터 rows x columns 까지의 수가 순서대로 적혀있다
  • (x1, y1, x2, y2)인 정수 4개로 표현된 회전이 주어진다
  • 각 회전 마다 x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전시킨다
  • 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하라
  • TC
    • input

      rows: 6 columns: 6
      queries: [[2,2,5,4],[3,3,6,6],[5,1,6,3]]

    • ouput

      [8, 10, 25]

해결방법

  • 꼭짓점에 도달할 때마다 direction 변수를 1 증가시켜서 방향을 바꿔주었다