https://www.acmicpc.net/problem/17276
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
1. 난이도 실버2
아래와 같은 규칙을 찾아서 해결하려고 했는데 너무 구현하기 복잡했다.
시계 방향인 경우
중간열 인덱스 => x+2, x+1, x, x-1, x-2 로 이동해야 함
부 대각선 인덱스 => y+2, y+1, y, y-1, y-2로 이동해야 함 등등......
그래서 결국 노가다로 푸는 걸 택했다.
아직 문제를 푼 사람이 많ㅈㅣ 않아서 좋은 방법을 못 찾음 ㅠㅠ 혹시 알게 되시면 알려주시라유
2. 내가 작성한 코드
1. temp1, temp2, temp3, temp4에 각각 중간 열, 부 대각선, 중간 행, 주 대각선의 value를 저장한다.
2. 만약 양수이면
부 대각선의 각 위치에 맞게 중간열의 value를 대입
중간 행의 각 위치에 맞게 부 대각선의 value를 대입
주 대각선의 각 위치에 맞게 중간행의 value를 대입
중간 열의 각 위치에 맞게 주 대각선의 value를 대입
3. 만약 음수이면 위와 반대로 돌려줌
⚠️ temp2(부대각선)의 경우 index의 순서가 반대로 대입되어야 함
ex) temp2[-1] 은 중간 열의 [0], temp2[-2] 는 중간 열의 [1],,,
4. 각도를 45로 나눈 몫만큼 1, 2나 1, 3번을 반복해 주면 됨
def repeat(op):
temp1 = [] #중간 열
temp2 = [] #부 대각선
temp3 = [] #중간 행
temp4 = [] #주 대각선
for i in range(n):
temp1.append(maps[i][n//2]) #중간 열 value 저장
temp2.append(maps[n-1-i][i]) #부 대각선 value 저장
temp3.append(maps[n//2][i]) #중간 행 value 저장
temp4.append(maps[i][i]) #주 대각선 value 저장
if op == "+": #시계 방향인 경우
for i in range(n):
maps[0+i][n-1-i] = temp1[i]
maps[n//2][i] = temp2[i]
maps[i][i] = temp3[i]
maps[i][n//2] = temp4[i]
else: #반시계 방향인 경우
for i in range(n):
maps[i][i] = temp1[i]
maps[n//2][i] = temp4[i]
maps[n-1-i][i] = temp3[i]
maps[i][n//2] = temp2[-1-i]
t = int(input())
for _ in range(t): #테스트를 t만큼 반복
n, d = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(n)]
if d < 0: op = "-" #음수인 경우 반시계 방향으로 이동
else: op = "+" #양수인 경우 시계 방향으로 이동
for i in range(abs(d)//45): #각도//45 만큼 반복
repeat(op)
for i in range(n):
for j in range(n):
print(maps[i][j],end=" ")
print()
'🔅코딩테스트 공부🔅 > ❗백준' 카테고리의 다른 글
[백준] 2615번 오목(python) (1) | 2023.04.25 |
---|---|
[백준] 22858번 원상 복구(small)(python) (0) | 2023.04.22 |
[백준] 17413번 단어 뒤집기2(python) (0) | 2023.04.21 |
[백준] 20291 파일 정리(python) (1) | 2023.04.20 |
[백준] 12933번 오리(python) (0) | 2023.04.20 |
댓글