Post
배열 돌리기(백준 17276번) | Gihun Son

배열 돌리기(백준 17276번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가?

  2. 1시간이내로 풀렸던 문제인가?✓

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?✓


난이도 체감

  1. 최상

  2. 중✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

크기가 n x n인 2차원 정수 배열 X가 있다. (n은 홀수)

X를 45° 의 배수만큼 시계방향 혹은 반시계방향으로 돌리려고 한다. X를 시계 방향으로 45° 돌리면 아래와 같은 연산이 동시에 X에 적용되어야 한다:

  • X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
  • X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다.
  • X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
  • X의 가운데 행을 X의 주 대각선으로 옮긴다.
  • 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
  • X의 다른 원소의 위치는 변하지 않는다.

반시계 방향으로 45° 돌리는 경우도 위와 비슷하게 정의된다.

예를 들어, 아래 그림 중앙에 5x5 배열 X가 있고, 이 배열을 시계방향 혹은 반시계방향으로 45° 돌렸을 때의 결과가 우측 그리고 좌측에 있다. 굵은 원소는 주 대각선 / 중간 열 / 부 대각선 / 중간 행에 위치한 원소이다.

Untitled

입력으로 2차원 배열 X와 어느 방향으로 몇 도 회전할지 입력 받아, 그 결과를 출력하는 프로그램을 작성하시오.

Untitled 1

Untitled 2

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys
from copy import deepcopy
input=sys.stdin.readline
T=int(input().strip())

for _ in range(T):
    n,d=map(int,input().strip().split())
    test_list=[]
    for _ in range(n):
        test_list.append(list(map(int,input().strip().split())))
    answer=[[0]*n for _ in range(n)]
    rotate=(abs(d)//45)%8
    if rotate==0:
        answer=test_list
    else:
        if d>0:
            num=n//2
            for _ in range(rotate):
                for i in range(n):
                    for j in range(n):
                        if i==j:
                            answer[i][num]=test_list[i][j]
                        elif j==num:
                            answer[i][n-i-1]=test_list[i][j]
                        elif j==n-i-1:
                            answer[num][j]=test_list[i][j]
                        elif i==num:
                            answer[j][j]=test_list[i][j]
                        else:
                            answer[i][j]=test_list[i][j]
                test_list=deepcopy(answer)
        else:
            num=n//2
            for _ in range(rotate):
                for i in range(n):
                    for j in range(n):
                        if i==j:
                            answer[num][j]=test_list[i][j]
                        elif j==num:
                            answer[i][i]=test_list[i][j]
                        elif j==n-i-1:
                            answer[i][num]=test_list[i][j]
                        elif i==num:
                            answer[n-j-1][j]=test_list[i][j]
                        else:
                            answer[i][j]=test_list[i][j]
                test_list=deepcopy(answer)
    for k in range(len(answer)):
        print(*answer[k])
  • 시계 방향과 반시계 방향일 때를 나누고, 45도로 몇번 돌아야 하는지에 따라 연산을 수행한다.
This post is licensed under CC BY 4.0 by the author.