행렬 테두리 회전하기

발자·2023년 6월 7일
0

programmers

목록 보기
26/34

문제

시간초과 코드

import copy
# 회전 함수
def rotation(rc_map, query):
    # 좌표
    [x1, y1, x2, y2] = query
    x1 -= 1
    y1 -= 1
    x2 -= 1
    y2 -= 1
    # 깊은 복사
    new_rc_map = copy.deepcopy(rc_map)
    # 움직인 값
    values = set()
    # x1줄 오른쪽 이동
    for y in range(y1, y2):
        value = rc_map[x1][y]
        values.add(value)
        new_rc_map[x1][y+1] = value
    # x2줄 왼쪽 이동
    for y in range(y2, y1, -1):
        value = rc_map[x2][y]
        values.add(value)
        new_rc_map[x2][y-1] = value
    # y1줄 위쪽 이동
    for x in range(x2, x1, -1):
        value = rc_map[x][y1]
        values.add(value)
        new_rc_map[x-1][y1] = value
    # y2줄 아래쪽 이동
    for x in range(x1, x2):
        value = rc_map[x][y2]
        values.add(value)
        new_rc_map[x+1][y2] = value
    return new_rc_map, min(values)

def solution(rows, columns, queries):
    # rows x columns 크기인 행렬
    rc_map = [[x*(columns)+(y+1) for y in range(columns)] for x in range(rows)]
    answer = []
    for query in queries:
        rc_map, value = rotation(rc_map, query)
        # 움직인 값 중에 가장 작은 값
        answer.append(value)
    return answer

깊은 복사로 풀었을 경우는 시간초과!

정답 코드

# 회전 함수
def rotation(rc_map, query):
    # 좌표
    [x1, y1, x2, y2] = query
    x1 -= 1
    y1 -= 1
    x2 -= 1
    y2 -= 1
    # 초기값
    tmp = rc_map[x1][y1]
    # 움직인 값
    mini = tmp
    # 거꾸로 가야 함!!
    # y1줄 위쪽 이동
    for x in range(x1, x2):
        value = rc_map[x+1][y1]
        rc_map[x][y1] = value
        mini = min(mini, value)
    # x2줄 왼쪽 이동
    for y in range(y1, y2):
        value = rc_map[x2][y+1]
        rc_map[x2][y] = value
        mini = min(mini, value)
    # y2줄 아래쪽 이동
    for x in range(x2, x1, -1):
        value = rc_map[x-1][y2]
        rc_map[x][y2] = value
        mini = min(mini, value)
    # x1줄 오른쪽 이동
    for y in range(y2, y1, -1):
        value = rc_map[x1][y-1]
        rc_map[x1][y] = value
        mini = min(mini, value)
    
    rc_map[x1][y1+1] = tmp
    return mini

def solution(rows, columns, queries):
    # rows x columns 크기인 행렬
    rc_map = [[x*(columns)+(y+1) for y in range(columns)] for x in range(rows)]
    answer = []
    for query in queries:
        value = rotation(rc_map, query)
        # 움직인 값 중에 가장 작은 값
        answer.append(value)

    return answer

0개의 댓글