ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2차원 리스트 테두리만 회전 시키기
    Data Structure & Algorithm 2021. 8. 30. 13:20
    반응형

    2차원 리스트에서 두 점을 기준으로 만들 수 있는 사각형이 있다고 할 때 사각형 테두리에 해당하는 원소들만 시계방향 또는 반시계 방향으로 한 칸씩 밀어낸 후 반환하는 함수를 작성해본다.

     

    tgt_list: 원본 list

    pt_a: 사각형 꼭지점 1에 해당하는 튜플 (y, x)

    pt_b: 사각형 꼭지점 2에 해당하는 튜플 (y, x)

    • 0 <= y < len(tgt_list) - 1
    • 0 <= x < len(tgt_list[0]) - 1

    is_clockwise: 시계 반시계 방향을 지정

    def cycle_seg_elem(tgt_list: list, pt_a: tuple, pt_b: tuple, is_clockwise: bool) -> list:
        """
        Cycle through the elements of a line segment.
        :param tgt_list: 일부 요소를 회전 시킬 작업 대상
        :param pt_a: 순환 범위를 지정할 지점 1, tuple type (y, x)
        :param pt_b: 순환 범위를 지정할 지점 2, tuple type (y, x)
        :param is_clockwise: 순환할 방향을 지정한다. True = 시계방향, False: 반시계방향
        :return: 순환이 완료된 리스트
        """
        height = len(tgt_list)
        width = len(tgt_list[0])
        # 두 점의 좌표가 리스트 안에 있는 경우에 한해서만 작업을 진행한다.
        if 0 <= pt_a[0] < height and 0 <= pt_a[1] < width and\
                0 <= pt_b[0] < height and 0 <= pt_b[1] < width:
            # 두 점의 y 또는 x가 좌표가 겹치는 경우에는 순환 시킬 수가 없으므로 원본 리스트를 그대로 리턴한다.
            if pt_a[0] == pt_b[0] or pt_a[1] == pt_b[1]:
                return tgt_list
            # 두 점을 비교하여 죄상점, 우하점 형태로 변환한다.
            min_y = min(pt_a[0], pt_b[0])
            min_x = min(pt_a[1], pt_b[1])
            max_y = max(pt_a[0], pt_b[0])
            max_x = max(pt_a[1], pt_b[1])
    
            temp_num = tgt_list[min_y][min_x]
            # 시계방향 순환
            if is_clockwise:
                for i in range(min_y, max_y):
                    tgt_list[i][min_x] = tgt_list[i + 1][min_x]
                for i in range(min_x, max_x):
                    tgt_list[max_y][i] = tgt_list[max_y][i + 1]
                for i in range(max_y, min_y, -1):
                    tgt_list[i][max_x] = tgt_list[i - 1][max_x]
                for i in range(max_x, min_x, -1):
                    if i == min_x + 1:
                        tgt_list[min_y][i] = temp_num
                    else:
                        tgt_list[min_y][i] = tgt_list[min_y][i - 1]
            # 반시계방향 순환
            else:
                for i in range(min_x, max_x):
                    tgt_list[min_y][i] = tgt_list[min_y][i + 1]
                for i in range(min_y, max_y):
                    tgt_list[i][max_x] = tgt_list[i + 1][max_x]
                for i in range(max_x, min_x, -1):
                    tgt_list[max_y][i] = tgt_list[max_y][i - 1]
                for i in range(max_y, min_y, -1):
                    if i == min_y + 1:
                        tgt_list[i][min_x] = temp_num
                    else:
                        tgt_list[i][min_x] = tgt_list[i - 1][min_x]
    
        return tgt_list

    댓글

Designed by Tistory.