이숭간 공부기록

[프로그래머스] 파이썬 _ 행렬 테두리 회전하기 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 행렬 테두리 회전하기

이숭간 2021. 8. 3. 17:40
728x90

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

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

문제유형 : 행렬, 구현

 

문제풀이 :

  • 2021 카카오페이인턴에서도 이런 행렬구현 문제가나왔다. 행렬의 부분을 따로빼서 조작하고 다시 붙인뒤 반복조작하는 느낌
  • 카카오공채 '자물쇠와 열쇠' 코드도 딱 이런 느낌이다.

 

  • 쿼리에 맞춰서 부분그래프를 빼낸다음 뺸 부분을 규칙에 맞게 테두리만 회전시킨다.
  • 회전시킨 그래프를 다시 원래그래프에 넣는다.
  • 쿼리가 끝날때까지 반복한다.

 

정답코드 :

def solution(rows, columns, queries):
    global answer
    answer = []

    graph = [[0] * columns for i in range(rows)]
    num = 1
    for i in range(rows):
        for j in range(columns):
            graph[i][j] = num
            num += 1

    # 쿼리에 맞춰서 부분그래프를 빼낸다음
    # 이동한 부분을 다시 집어넣는다.
    # 반복

    for q in queries:

        temp = []
        s_x, s_y, e_x, e_y = q[0]-1, q[1]-1, q[2]-1, q[3]-1
        for line in graph[s_x:e_x+1]:
            temp.append(line[s_y:e_y+1])
        new_graph = rotate_outline(temp, len(temp[0]), len(temp))

        for i in range(len(temp)):
            for j in range(len(temp[0])):
                graph[i+s_x][j+s_y] = new_graph[i][j]

    return answer


def rotate_outline(graph, n, m):
    global answer
    new_graph = [[0]*n for _ in range(m)]
    min_val = int(1e4)

    for i in range(m):
        for j in range(n):
            val = graph[i][j]

            if i == 0 and j < n - 1:
                new_graph[i][j + 1] = val
            elif i < m - 1 and j == n - 1:
                new_graph[i + 1][j] = val
            elif i == m - 1 and j > 0:
                new_graph[i][j - 1] = val
            elif i > 0 and j == 0:
                new_graph[i - 1][j] = val
            else:
                new_graph[i][j] = val
                continue
            min_val = min(min_val, val)
    answer.append(min_val)
    return new_graph