16926: 배열 돌리기 1 && 16927: 배열 돌리기 2

ewillwin·2023년 6월 20일
0

Problem Solving (BOJ)

목록 보기
80/230

  • 1학기때 삼성sds 코테 미궁탈출 문제에서 배열 돌리는 유형이 나왔었는데, 당시에는 for문 엄청 돌면서 삽질했음/ 16926 문제에선 학습을 위해 최적화된 코드를 참조함
  • 배열이 회전을 할 때는 껍질별로 회전을 함
    -> 때문에 껍질의 개수 (min(N, M) // 2) 만큼 for문을 돌며 바깥쪽 껍질부터 안쪽 껍질까지 작업을 진행함
    -> 하나의 껍질을 queue에 담아주고, deque의 rotate 메소드를 이용해 R만큼 회전시키고 이를 answer 2차원 리스트에 담아줌 (queue.rotate(R)은 시계방향으로 R만큼 회전, queue.rotate(-R)은 반시계방향으로 R만큼 회전)
  • 인덱스 맞추는 부분이 좀 머리가 아픈데, 껍질의 위쪽, 오른쪽, 아래쪽, 왼쪽은 아래와 같음
import sys
from collections import deque

N, M, R = map(int, sys.stdin.readline()[:-1].split())
arr = []
for n in range(N):
	arr.append(list(sys.stdin.readline()[:-1].split()))

answer = [[0] * M for n in range(N)]
for i in range(min(N, M) // 2): #껍질의 개수만큼 순회 (N = 5, M = 4라면 4 // 2인 2가 껍질의 개수가 됨)
	queue = deque([]) #껍질별로 위쪽, 오른쪽, 아래쪽, 왼쪽 순서(시계방향)로 넣어줄거임
	queue.extend(arr[i][i:M - i]) #위쪽
	queue.extend([row[M - i - 1] for row in arr[i + 1: N - i - 1]]) #오른쪽
	queue.extend(arr[N - i - 1][i:M - i][::-1]) #아래쪽
	queue.extend([row[i] for row in arr[i + 1:N - i - 1]][::-1]) #왼쪽

	queue.rotate(-R) #반시계방향으로 R만큼 회전

	#answer 2차원 리스트에 회전한 값(회전한 껍질) 넣기
	for j in range(i, M - i): #위쪽(i, 4-i)
		answer[i][j] = queue.popleft()
	for j in range(i + 1, N - i - 1): #오른쪽(i+1, 4-i)
		answer[j][M - i - 1] = queue.popleft()
	for j in range(M - i - 1, i - 1, -1): #아래쪽(3-i, i-1, -1)
		answer[N - i - 1][j] = queue.popleft()
	for j in range(N - i - 2, i, -1): #왼쪽(3-i, i, -1)
		answer[j][i] = queue.popleft()

for i in range(len(answer)):
	print(" ".join(answer[i]))
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글