Programmers_2021 Dev Mathcing 행렬 테두리 회전하기 (python)
프로그래머스 -행렬 테두리 회전하기 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/77485#
2. 분류 및 난이도
Programmers 문제입니다.
2021 Dev mathcing 웹 백엔드 개발 문제입니다. Level 2난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- 최악의 경우 1,1,100,100 이 만 번의 쿼리가 반복된다면 brute한 접근으로는 터질거라 생각했습니다.
- 풀고나니 다행스럽게도(?) 이러한 입력은 없는 것 같습니다.
- 이러한 문제를 해결하기 위해 1가지 방법을 생각해냈습니다.
- 총 2가지 방법을 생각했습니다.
- 처음은 메모리를 아끼기 위해 주어진 map에서 모든 것을 처리하여 query에 대한 정보값도 저장하여 효율성을 극대화하려고 했습니다.
- 이러한 방식은 코드가 너무 복잡할 것 같고, 문제를 해결하기엔 시간을 너무 많이 투자할 것 같았습니다.
- 2번째 방법은 기존 map에 대한 정보를 담고 있는 copymap을 선언하여, 회전이 끝날 때마다 copymap에 map정보를 갱신해주는 방식입니다.
- copymap에 회전하지 않은 구간까지 다시 복사하는 것은 시간초과가 나서 회전한 구간만 갱신해주는 코드를 작성하였습니다.
4. 접근 방법을 적용한 코드
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
import copy
def solution(rows, columns, queries):
answer = []
#map
map = [0] * rows
idx = 1
for i in range(rows) :
map[i] = [0] * columns
for j in range(columns) :
map[i][j] =idx
idx+=1
#python에서 깊은 복사를 하기 위해서는 밑처럼 써야합니다.
copymap = copy.deepcopy(map)
for i in range(len(queries)):
# 문제에서의 좌표는 1,1로 시작하므로 1씩 빼줍니다.
x1 = queries[i][0]-1
y1 = queries[i][1]-1
x2 = queries[i][2]-1
y2 = queries[i][3]-1
#print(x1,y1,x2,y2)
#step 1
minN = map[x1][y1]
for j in range(y1+1,y2+1) :
map[x1][j] = copymap[x1][j-1]
minN = min(minN,map[x1][j])
#step 2
for j in range(x1+1,x2+1) :
map[j][y2] = copymap[j-1][y2]
minN = min(minN,map[j][y2])
#step 3
for j in range(y2-1,y1-1,-1):
map[x2][j] = copymap[x2][j+1]
minN = min(minN,map[x2][j])
#step 4
for j in range(x2-1,x1-1,-1):
map[j][y1] = copymap[j+1][y1]
minN = min(minN,map[j][y1])
answer.append(minN)
#copymap 수정
for j in range(y1,y2+1):
copymap[x1][j] = map[x1][j]
copymap[x2][j] = map[x2][j]
for j in range(x1,x2+1) :
copymap[j][y2] = map[j][y2]
copymap[j][y1] = map[j][y1]
#print(map,copymap)
return answer
5. 결과
필요시. c++ 짜드리겠습니다.
This post is licensed under CC BY 4.0 by the author.