728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
단순 구현 문제다.
특별한 알고리즘을 사용할 필요 없이 문제에서 제시된 조건을 구현하면 됨
import copy
# 행렬을 query를 통해 시계방향으로 회전시킨 후의 행렬을 반환하는 함수
def rotate_matrix(graph, query):
# new_graph = copy.deepcopy(graph) -> 시간초과
new_graph = [i.copy() for i in graph] # 시계방향으로 회전시킨 후의 행렬
x1 = query[0] - 1
y1 = query[1] - 1
x2 = query[2] - 1
y2 = query[3] - 1
min_val = 100001
# 1. 위 테두리
for j in range(y1, y2):
new_graph[x1][j+1] = graph[x1][j]
if new_graph[x1][j+1] < min_val:
min_val = new_graph[x1][j+1]
# 2. 오른쪽 테두리
for i in range(x1, x2):
new_graph[i+1][y2] = graph[i][y2]
if new_graph[i+1][y2] < min_val:
min_val = new_graph[i+1][y2]
# 3. 아래 테두리
for j in range(y2, y1, -1):
new_graph[x2][j-1] = graph[x2][j]
if new_graph[x2][j-1] < min_val:
min_val = new_graph[x2][j-1]
# 4. 왼쪽 테두리
for i in range(x2, x1, -1):
new_graph[i-1][y1] = graph[i][y1]
if new_graph[i-1][y1] < min_val:
min_val = new_graph[i-1][y1]
return new_graph, min_val
def solution(rows, columns, queries):
answer = []
# 초기 행렬
graph = []
for i in range(rows):
row = [i*columns + j for j in range(1, columns + 1)]
graph.append(row)
# 행렬 회전후, 최솟값 추가
for query in queries:
graph, min_val = rotate_matrix(graph, query)
answer.append(min_val)
return answer
그냥 구현하면 되는 문제지만 블로그에 포스팅하는 이유는 deepcopy 때문이다.
위 코드에서
import copy
# 행렬을 query를 통해 시계방향으로 회전시킨 후의 행렬을 반환하는 함수
def rotate_matrix(graph, query):
# new_graph = copy.deepcopy(graph) -> 시간초과
new_graph = [i.copy() for i in graph] # 시계방향으로 회전시킨 후의 행렬
graph를 copy하는 부분의 코드를 위 주석처리한 copy.deepcopy 메소드로 바꿀 경우 시간초과가 발생한다.
왜 그럴까?
[파이썬] 리스트의 깊은복사는 deepcopy가 빠를까? slicing이 빠를까?
리스트의 깊은복사는 어떤게 더 빠를까?
velog.io
이 링크를 참고해보면, deepcopy는 그냥 드럽게 느리다고 한다.
그래서 파이썬에서 깊은 복사를 할 수 있는 다른 방법인 slicing을 사용해서 깊은 복사를 하는게 좋다고 한다.
new_graph = [i[:] for i in graph] # slicing 활용한 deepcopy
이렇게 slicing을 활용해서 깊은 복사를 할 수도 있다.
728x90