-
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
'Data Structure & Algorithm' 카테고리의 다른 글
[프로그래머스] 프린터 (0) 2021.09.05 Circular Buffer with Python (0) 2021.09.04 소수판별 알고리즘 (0) 2021.08.16 1부터 순서대로 값을 채운 N * N 2차원 리스트 (0) 2021.08.15 파이썬 2차원 리스트 회전 (How to rotate 2D list on Python) (0) 2021.07.20