honey_pot
[Python] 행렬 테두리 회전하기 본문
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