알고리즘 풀어주는 블로그

Programmers 77485 : 행렬 테두리 회전하기 - python 본문

알고리즘 문제/programmers

Programmers 77485 : 행렬 테두리 회전하기 - python

요네리 2021. 5. 19. 20:25

Q. 문제

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

A. 풀이

 

def solution(rows, columns, queries):
    answer = []
    mp = [[0] * (columns + 1) for _ in range(rows + 1)]
    n = 1
    for i in range(1, rows + 1):
        for j in range(1, columns + 1):
            mp[i][j] = n
            n += 1

    for q in queries:
        
        x1 = q[0]
        y1 = q[1]
        x2 = q[2]
        y2 = q[3]
        mp[x1][y1] = mp[x1][y1]
        tmp = mp[x1][y1]
        
        mn = rows*columns
        for i in range(x1, x2):
            mp[i][y1] = mp[i + 1][y1]
            mn = min(mn, mp[i][y1])
        
        for j in range(y1, y2):
            mp[x2][j] = mp[x2][j + 1]
            mn = min(mn, mp[x2][j])
            
        for i in range(x2, x1, -1):
            mp[i][y2] = mp[i - 1][y2]
            mn = min(mn, mp[i][y2])
            
        for j in range(y2, y1, -1):
            mp[x1][j] = mp[x1][j - 1]
            if j == y1 + 1:
                mp[x1][j] = tmp
            mn = min(mn, mp[x1][j])
            
        answer.append(mn)
    return answer

 

1. 각 숫자가 있는 맵을 만든다

2. 반대 방향으로 돌면서 맵을 스왑한다

3. 스왑하는 수 중에 가장 작은 수를 찾는다