링크 : https://www.acmicpc.net/problem/17276
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
- 문제
- 소요시간: 시간 많이 소요됨
- 설계하기(접근방법)
1. 입력받기
1) t를 입력받는다
2) n, d를 입력받는다
3) 배열을 입력받는다.
2. 구현 해석
문제 해석이 어려워 보일 수 있지만 배의 키를 45도 돌린다고 생각하면 된다.
1) 배열 구성
총 4개의 배열이 돌아간다
Ex) n = 5
1) 좌상우하
arr[j][j]
-> [0,0], [1,1], [2,2], [3,3]....
2)중간 상하
arr[0][2]
arr[1][2]
arr[2][2]....
-> arr[j][(n-1)//2]
3)우상 좌하
arr[0][4]
arr[1][3]
arr[2][2].....
-> arr[j][n-1-j]
4)중간 우좌
arr[2][4]
arr[2][3]
arr[2][2].....
-> arr[(n-1)//2][n-1-j]
이 배열들을 각각 꼬리를 물며 rotate하면 된다
2) rorate 구현
각각의 배열을 순서대로 돌아가면서 new_arr에 입력해준다
반대의 경우는 반대로 구현해준다
아래의 코드 참고
3) d를 45로 나누고 나온 몫만큼 각각의 메서드를 반복한다
3. 형식에 맞게 출력한다
- 코드(출력)
import copy
import sys
input = sys.stdin.readline
t = int(input())
def rotate_45(arr, new_arr):
for j in range(n):
new_arr[j][j] = arr[(n-1)//2][j]
new_arr[j][(n-1)//2] = arr[j][j]
new_arr[j][n-1-j] = arr[j][(n-1)//2]
new_arr[(n-1)//2][n-1 - j] = arr[j][n-1-j]
def rotate_R45(arr, new_arr):
for j in range(n):
new_arr[j][j] = arr[j][(n-1)//2]
new_arr[j][(n-1)//2] = arr[j][n-1-j]
new_arr[j][n-1-j] = arr[(n-1)//2][n-1-j]
new_arr[(n-1)//2][n-1 - j] = arr[n-1-j][n-1-j]
for i in range(t):
n, d = map(int, input().split())
arr = []
repeat = d // 45
for j in range(n):
arr.append(list(map(int, input().split())))
new_arr = copy.deepcopy(arr)
if d > 0:
for _ in range(repeat):
rotate_45(arr, new_arr)
arr = copy.deepcopy(new_arr)
if d < 0:
for _ in range(abs(repeat)):
rotate_R45(arr, new_arr)
arr = copy.deepcopy(new_arr)
for k in new_arr:
print(*k)
- 얻어갈 부분
1. 이중배열을 구현하는데 너무 오랜 시간이 걸렸다. 자꾸 막구현을 하지 말고 천천히 노트에 배열을 적어보면서 구현하자
'알고리즘(백준) > 구현' 카테고리의 다른 글
[알고리즘/구현] 2615번 : 오목 - python (0) | 2023.05.02 |
---|---|
[알고리즘/구현] 15787번 : 기차 - python (0) | 2023.04.27 |
[알고리즘/구현] 22858번 : 원상 복구(small) - python (0) | 2023.04.19 |
[알고리즘/구현] 17413번 : 단어 뒤집기 2 - python (0) | 2023.04.18 |
[알고리즘/구현] 20291번 : 파일 정리 - python (1) | 2023.04.17 |