2024. 1. 25. 21:40ㆍPS/PS 팁
[ 작성 이유 ]
생각보다 구현과 관련해서 PS로 배열을 돌려야하는 상황이 자주 있는 것 같다. 예전에 코딩테스트를 봤을 때도 배열 돌리기 문제가 굉장히 귀찮았던 것으로 기억한다. 하는 김에 배열 돌리기를 한번 익혀 보자.
[ N x N 배열을 돌려보자 ]
N x N 배열을 한번 돌려보자. 배열을 돌리면 규칙을 발견할 수 있다. 우선 배열을 좌측으로 회전시켜보자.
좌표를 기준으로 놓았는데 총 9개의 결과를 얻을 수 있다.
(0,0) -> (2,0) | (0,1) -> (1,0) | (0, 2) -> (0,0) |
(1,0) -> (2,1) | (1,1) -> (1,1) | (1,2) -> (0,1) |
(2,0) -> (2,2) | (2,1) -> (1,2) | (2,2) -> (0,2)
좌측으로 회전하면 알 수 있는 규칙은 N x N일 때 각각의 좌표가 (i, j)라고 하면 회전 후 (N-1-j, i)로 이동한다.
똑같은 방식으로 우측 회전을 구해보면 우측으로 회전할 땐 N x N인 경우 각각의 좌표가 (i,j)라고 하면 회전 후 (j, N-1-i)으로 이동한다.
그리고 180도로 회전하게 되면 기존 좌표와 대비해서 (N-i-1, N-j-1)로 이동하게 된다.
그러면 코드로 다음과 같이 작성할 수 있다. 되도록이면 간단하니까 좀 외워야겠다. 규칙이 어렵진 않은데 생각보다 딱 찾으라고 하면 꽤나 시간이 오래 걸린다.
def roration(rotate, key):
N = len(key)
if(rotate == 0): # 좌측회전 90도
rotateKey = [[0] * N for i in range(N)]
for i in range(N):
for j in range(N):
rotateKey[N-1-j][i] = key[i][j]
return rotateKey
elif(rotate == 1): # 우측회전 90도
rotateKey = [[0] * N for i in range(N)]
for i in range(N):
for j in range(N):
rotateKey[j][N-1-i] = key[i][j]
return rotateKey
elif(rotate == 2): # 180도 회전
rotateKey = [[0] * N for i in range(N)]
for i in range(N):
for j in range(N):
rotateKey[N-1-i][N-1-j] = key[i][j]
return rotateKey
[ N x M 배열을 회전 시켜보자 ]
배열 회전에서 새 배열을 할당하는 이유는 그게 값을 변경할 때 더 자유롭기 때문이다. 특히 어지간한 난이도의 문제에서는 N x N의 배열이 아니라 N x M의 배열을 회전시키게 할 것이다. 그런데 N x M을 회전시키면 M x N 배열이 된다. 이걸 기존 배열에서 조작해서 만드는 것은 쉽지 않다. 차라리 새 배열을 만들어서 거기에 값을 복사해놓고 덮어 씌워버리는게 제일 좋다.
좌측으로 회전 시켰을 때는 (i, j)에 있던 게 (M-1-j, i)으로 이동한다.
우측으로 회전 시켰을 때에는 (i, j) 값이 (j, N-1-i)으로 이동하게 된다.
180도 회전시켰을 땐 (i, j) 값이 (N-1-i)(M-1-j)값으로 이동하게 된다.
이를 코드로 나타내면 다음과 같이 표현할 수 있다.
def roration(rotate, key):
N = len(key)
M = len(key[0])
if(rotate == 0): # 좌측회전 90도
rotateKey = [[0] * N for i in range(M)]
for i in range(N):
for j in range(M):
rotateKey[M-1-j][i] = key[i][j]
return rotateKey
elif(rotate == 1): # 우측회전 90도
rotateKey = [[0] * N for i in range(M)]
for i in range(N):
for j in range(M):
rotateKey[j][N-1-i] = key[i][j]
return rotateKey
elif(rotate == 2): # 180도 회전
rotateKey = [[0] * M for i in range(N)]
for i in range(N):
for j in range(M):
rotateKey[N-1-i][M-1-j] = key[i][j]
return rotateKey
'PS > PS 팁' 카테고리의 다른 글
내가 보려고 만든 PS 팁 - 1 (0) | 2024.03.23 |
---|