honey_pot

[Python] 행렬 테두리 회전하기 본문

문제 풀이

[Python] 행렬 테두리 회전하기

_tera_ 2022. 6. 30. 13:18

https://programmers.co.kr/learn/courses/30/lessons/77485


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def solution(rows, columns, queries):
  
    def _rotate(x1, y1, x2, y2): # 내부 함수 -> 언더바 
        min_num = []  # 위치를 바꾼 모든 숫자를 넣고 최종적으로 위치가 바뀐 숫자들 중 가장 작은 숫자 넣고 리턴할 변수
 
        # 윗변 -> 오른쪽으로 shift
        temp1 = a[x1][y2] # 각 변의 끝 부분을 임시변수에 저장하고 사각형의 직각 부분 회전할 때 비는 공간에 넣는다.
        min_num.append(temp1) # temp 로 저장한 값부터 min_num에 저장
 
        for y in range(y2, y1, -1):
            min_num.append(a[x1][y])
            min_num.append(a[x1][y - 1]) # 바꾼 숫자들 전부 min_num에 저장
            a[x1][y] = a[x1][y - 1]
 
        # 오른쪽 변 -> 아래로 shift
        temp2 = a[x2][y2]
        min_num.append(temp2)
        
        for x in range(x2, x1 + 1 , -1):
            min_num.append(a[x][y2])
            min_num.append(a[x - 1][y2])
            a[x][y2] = a[x - 1][y2]
        a[x1 + 1][y2] = temp1
 
        # 아랫변 -> 왼쪽으로 shift
        temp3 = a[x2][y1]
        min_num.append(temp3)
        
        for y in range(y1, y2-1):
            min_num.append(a[x2][y])
            min_num.append(a[x2][y + 1])
            a[x2][y] = a[x2][y + 1]
        a[x2][y2-1= temp2
 
        # 왼쪽 변 -> 위로 shift
        for x in range(x1, x2-1):
            min_num.append(a[x][y1])
            min_num.append(a[x + 1][y1])
            a[x][y1] = a[x + 1][y1]
        a[x2 - 1][y1] = temp3
 
        min_num = set(min_num)
        return min(min_num)
 
    a = [[0* columns for _ in range(rows)] # row * column 크기의 격자 생성
    for i in range(1, rows + 1):  # 1 ~ row * column 숫자 만큼 격자에 값 채우기
        for j in range(1, columns + 1):
            a[i - 1][j - 1= (i - 1* columns + j
 
    answer = []
 
    # x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전
 
    for q in queries:
        x1, y1, x2, y2 = q
        x1, y1, x2, y2 = x1 - 1, y1 - 1, x2 - 1, y2 - 1 # 격자 인덱스는 0부터 시작하므로 -1
        answer.append(_rotate(x1, y1, x2, y2)) # answer 배열에 최솟값 추가
 
    # 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return
    return answer
 
 
cs

다른 사람 풀이 보니까 버블처럼 앞뒤 숫자를 스왑하면서 회전하던데 그것도 좋은 방법인 것 같다

'문제 풀이' 카테고리의 다른 글

[Python] 3 x n 타일링  (0) 2022.07.12
[Python] 구명보트  (0) 2022.07.12
[Python] N개의 최소공배수  (0) 2022.06.27
[Python] 배달  (0) 2022.06.27
[Python] 모음 사전  (0) 2022.06.27
Comments