프로그래머스 77485 행렬 테두리 회전하기 Python

hyereen·2022년 6월 9일
0

Coding-Test

목록 보기
3/3

출처: https://programmers.co.kr/learn/courses/30/lessons/77485?language=python3

문제 풀면서 어려웠던 점

  1. 나는 이해하는데, 내가 만든 풀이를 어떻게 설명하지..(?)
  2. 주석을 달아놨어도 처음보는 사람이 이해할지 잘 모르겠다.. 조금 더 이해하기 쉬운 코드를 만들어야겠다

풀이

def solution(rows, columns, queries):
    answer = [] # 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 담을 배열
    graph = [] # rows * columns 행열 
    n = 1 # graph에 칸별 숫자 채울 변수
    
    # 그래프 그리기
    for i in range(rows):
        temp = []
        for j in range(columns):
            temp.append(n)
            n += 1
        graph.append(temp)
    
    # 회전 함수 -> 한번 실행마다 쿼리에 해당하는 테두리의 숫자들을 회전시킨 그래프를 리턴
    def rotate(graph, rotate_list, r1, r2, c1, c2):
        # 새로운 그래프 그리기
        new_graph = []
        for i in graph:
            new_graph.append(i[:])
        
        # 움직일 숫자들의 좌표를 저장할 리스트
        # 순서대로 오른쪽, 아래쪽, 왼쪽, 위쪽으로 움직일 숫자들의 좌표를 저장
        new_rotate_list = [[], [], [], []]
        for r, c in rotate_list:
            if r == r1: # 오른쪽으로 움직일 숫자들의 공통점은 행이 r1
                new_rotate_list[0].append([r,c])
            if c == c2: # 아래쪽으로 움직일 숫자들의 공통점은 열이 c2
                new_rotate_list[1].append([r,c])
            if r == r2: # 왼쪽으로 움직일 숫자들의 공통점은 행이 r2
                new_rotate_list[2].insert(0, [r,c]) # 왼쪽으로 순서대로 움직여야 하므로 리스트의 앞에 저장
            if c == c1: # 위쪽으로 움직일 숫자들의 공통점은 열이 c1
                new_rotate_list[3].insert(0, [r,c]) # 위쪽으로 순서대로 움직여야 하므로 리스트의 위에 저장
        
        # 움직일 숫자들의 개수는 보다 하나 작은 수들이 이동함
        # 왜냐면 가로로 오른쪽으로 한칸씩 움직인다고 가정하면, 가장 오른쪽 수는 테두리를 나가버리기 때문
        # 따라서 맨끝 하나를 제외한 나머지들을 ori(gin)으로 뽑는다
        
        # 반면 움직일 숫자들이 새로운 그래프(new_graph)에 위치할 좌표는 한칸씩 미뤄지므로
        # 마찬가지로 가로로 오른쪽으로 한칸씩 움직인다고 가정하면, 가장 왼쪽의 칸은 새로운 수가 위치되지 않음 
        for lst in new_rotate_list:
            for ori, nw in zip(lst[:-1], lst[1:]):
                r = ori[0]
                c = ori[1]
                nr = nw[0]
                nc = nw[1]
                new_graph[nr][nc] = graph[r][c]
        return new_graph
                
    
    for q in queries:
        # 문제에서 말하는 좌표는 1부터 시작하므로 하나씩 빼줌
        r1 = q[0] -1
        r2 = q[2] -1
        c1 = q[1] -1
        c2 = q[3] -1
        rotate_list = [] # 회전할 좌표들을 저장하는 리스트
        rotate_list_value = [] # 회전할 좌표의 값(숫자)를 저장하는 리스트
        for i in range(rows):
            for j in range(columns):
                if r1 <= i <= r2 and c1 <= j <= c2:
                    if r1 < i < r2 and c1 < j < c2: # 가운데부분은 회전되지 않음
                        pass
                    else: # 가운데말고 테두리들은 회전되므로 좌표와 그 값을 저장 
                        rotate_list.append([i,j])
                        rotate_list_value.append(graph[i][j])
        answer.append(min(rotate_list_value)) # 회전 될때 가장 작은 수 
        graph = rotate(graph, rotate_list, r1, r2, c1, c2) # 쿼리마다 회전해서 graph에 저장해줌 
    return answer
profile
안녕하세요. 피드백은 언제나 감사합니다.

0개의 댓글