본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 배열 돌리기(python)

by 윤무무 2023. 4. 23.

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()

 

댓글