알고리즘/문제풀이

[Python] Programmers 행렬 테두리 회전하기

정찡이 2021. 7. 24. 19:24
728x90

1. 문제 링크

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


2. 문제 요약

  • 해당 위치를 시계 방향 회전한다. 회전에 의해 바뀐 숫자 중 가장 작은 숫자를 배열에 담아 리턴한다.

문제 요약 


3. 아이디어 정리

  1. 시계 방향으로 회전하기
    • 아래 그림과 같은 로직으로 진행된다.
    • 왼쪽 > 오른쪽, 위 > 아래, 오른쪽 > 왼쪽, 아래 > 위 순서로 swap 하면서 진행한다.
  2. 회전한 숫자 중 최소값 찾기

행렬 테두리 회전 로직 설명 

 


4. 문제 풀이

4-1. 내 풀이

def solution(rows, columns, queries):
    """
    시계 방향으로 회전해서 이동한 숫자 중 최솟값 구하기
    1. 시계방향 회전
    2. 회전한 숫자 저장해서 최솟값 찾기
    """
    def rotate(left, right, top, bottom):
        """
        시계방향 회전 
        :return: 위치가 바뀐 숫자 중 가장 작은 값 
        """
        pre = graph[top][left]
        min_num = [pre]
        # 왼 > 오
        for i in range(left, right + 1):
            pre, graph[top][i] = graph[top][i], pre
            min_num.append(pre)
        # 위 > 아래
        for i in range(top + 1, bottom + 1):
            pre, graph[i][right] = graph[i][right], pre
            min_num.append(pre)
        # 오 > 왼
        for i in range(right - 1, left - 1, - 1):
            pre, graph[bottom][i] = graph[bottom][i], pre
            min_num.append(pre)
        # 아래 > 위
        for i in range(bottom - 1, top - 1, -1):
            pre, graph[i][left] = graph[i][left], pre
            min_num.append(pre)
        return min(min_num)

    answer = list()
    graph = [[0] * columns for _ in range(rows)]
    count = 1
    for i in range(rows):
        for j in range(columns):
            graph[i][j] = count
            count += 1
        # 회전하면서 결과 담기 
    for querie in queries:
        answer.append(rotate(left=querie[1] - 1, right=querie[3] - 1, top=querie[0] - 1, bottom=querie[2] - 1))
    return answer

 


5. 결론

  • 배열 돌리기 문제 ⇒ 구현 문제

 

반응형