[Python] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 행렬 테두리 회전하기

송진영·2022년 10월 20일
0

프로그래머스-python

목록 보기
18/22

2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 행렬 테두리 회전하기

문제 풀이

반복문으로 한 번에 회전하는 방법은 없기에 상하좌우 총 4번으로 나눠서 회전을 해야 한다.

그런데 문제는 회전하게 되면 줄의 끝 번호는 회전에 의해 사라지게 된다는 것이다.
그래서 그 번호를 기억해둬야 한다.

좌를 시작으로 반시계 방향(좌 -> 하 -> 우 -> 상 순서)으로 회전을 진행하면 왼쪽 제일 위 번호만 사라지기 때문에 왼쪽 제일 위 번호만 기억해두면 번호의 손실은 없다.

결론

반시계 방향(좌 -> 하 -> 우 -> 상) 회전하고 왼쪽 제일 위 다음 번호를 기억해둔 번호로 변경한다. 그리고, 매 회전마다 회전하는 번호들을 비교하여 회전한 번호 중 가장 작은 번호를 찾는다.

def solution(rows, columns, queries):
    answer = []
    arr = [[0]*columns for _ in range(rows)]
    cnt = 1
    for i in range(rows):
        for j in range(columns):
            arr[i][j] = cnt
            cnt += 1
            
    for x1,y1,x2,y2 in queries:
        tmp = arr[x1-1][y1-1]
        min_num = tmp
        for i in range(x2-x1): # 왼쪽 세로
            change_num = arr[x1+i][y1-1]
            arr[x1-1+i][y1-1] = change_num
            min_num = min(min_num,change_num)
            
        for i in range(y2-y1): # 아래쪽 가로
            change_num = arr[x2-1][y1+i]
            arr[x2-1][y1-1+i] = change_num
            min_num = min(min_num,change_num)

        for i in range(x2-x1): # 오른쪽 세로
            change_num = arr[x2-2-i][y2-1]
            arr[x2-1-i][y2-1] = change_num
            min_num = min(min_num,change_num)

        for i in range(y2-y1): # 위쪽 가로
            change_num = arr[x1-1][y2-2-i]
            arr[x1-1][y2-1-i] = change_num
            min_num = min(min_num,change_num)
        
        arr[x1-1][y1] = tmp

        answer.append(min_num)    
            
        
    return answer
profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.

0개의 댓글