728x90
📍 2차원 행렬 시계방향으로 한 칸씩 회전하기
카카오 코딩 테스트를 보다가 2차원 행렬을 시계방향으로 회전하라길래 저번에 배열돌리기 3 문제를 풀어본 경험이 있어 풀 수 있을 것 같았는데 못 풀었다. 😂 😂 눈물을 머금으며 다음엔 꼭 풀겠다는 취지로 글을 남긴다.
이번에는 90도
회전이 아닌 시계방향
혹은 반시계방향
으로 한 칸씩 이동하는 방법을 배워보려고 한다. 이때 전체 범위를 회전하지 말고 주어진 범위 내에서 테두리의 값만 이동하자. 다음과 같이 5*5
행렬이 있을 때 파란색 빗금 친 범위만 시계방향으로 바꾸려고 한다.
처음 로직을 구현할 때 dx
, dy
를 이용해서 옮길 좌표를 우측으로 한 칸 혹은 아래쪽으로 한 칸 이렇게 짜는 줄 알았더니 dx
, dy
는 사용하지 않고, 범위를 설정해서 row+1
혹은 column+1
을 해주는 방법을 사용해야 한다.
728x90
순서는 다음과 같다.
- 우리가 퍼즐을 맞출 때 한 칸을 따로 빼두고 진행하는 것처럼 배열에서
temp
에 저장할 값 1개를 빼둔다. (그래야 빼 둔 칸으로 한 칸씩 밀어 올릴 수 있다. 나는temp
를7
로 정했다.) - 시계방향으로 움직인다고 해서
temp
를 기준으로 시계방향으로 이동하는 것이 아니라 우리는 반 시계방향으로 값을 하나씩 이동시켜준다. 여기서 중요한 포인트는 한 반복문에서 값을 이동시킬 때 맨 마지막 값은 그대로 남아 있다는 것이다. (이 포인트를 생각하지 못해서 감을 못 잡았었다.) - 반복문의 범위는 이동시키려고 하는 값의 반대 방향으로 선언해야 한다. (1번과 2번은
linear
, 3번과 4번은reverse
) - 하단 그림의 4번까지 끝내고 나서
temp
는 맨 처음temp
위치에서column + 1
값에 넣어준다. (반시계 방향이면row-1
이겠지??)
row, column = 5, 5
queries = [[2, 2, 4, 4]] # x1, y1, x2, y2 (x1, y1 부터 x2, y2 범위)
arr = [[0] * column for _ in range(row)]
cnt = 0
for i in range(row):
for j in range(column):
cnt += 1
arr[i][j] = cnt
for t, l, b, r in queries:
top, left, bottom, right = t - 1, l - 1, b - 1, r - 1 # index 계산을 편하게 하기 위해서 빼준다.
temp = arr[top][left]
for k in range(top, bottom): # 1번
arr[k][left] = arr[k + 1][left]
for k in range(left, right): # 2번
arr[bottom][k] = arr[bottom][k + 1]
for k in range(bottom, top, -1): # 3번
arr[k][right] = arr[k - 1][right]
for k in range(right, left, -1): # 4번
arr[top][k] = arr[top][k - 1]
arr[top][left + 1] = temp # temp 넣기
for i in arr:
print(*i, end=' ')
print()
👉🏽
1 2 3 4 5
6 12 7 8 10
11 17 13 9 15
16 18 19 14 20
21 22 23 24 25
반응형
'Python > 파이썬 문법 Tips' 카테고리의 다른 글
[ 파이썬(python) ] 공백으로 들어온 int를 공통으로 빼주기 (0) | 2021.07.19 |
---|---|
[ 파이썬(python) ] 절사평균과 round(반올림) 함수 그리고 부동소수점 비교 (0) | 2021.07.13 |
[ 파이썬(python) ] python에서 음의 정수를 floor 해보기 (0) | 2021.07.01 |
[ 파이썬(python) ] 리스트 중 front, back에서부터 target index까지 어느쪽이 더 가까운지 판단하기 (0) | 2021.06.25 |
[ 파이썬(python) ] 삼각수(계차수열) 나타내기 (0) | 2021.06.20 |
댓글