이 험난한 세상에서어어~

배열 돌리기 본문

algorithm/코딩 테스트

배열 돌리기

토끼띠NJW 2023. 5. 28. 22:47

문제 설명

배열을 45도로 돌리는 문제다. 문제가 상당히 길기에 백준 링크로 가서 차근차근 읽어보는 것을 추천한다.

https://www.acmicpc.net/problem/17276

 

17276번: 배열 돌리기

각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. 

www.acmicpc.net

일단 푸는 방법은 문제에 설명한 것들을 그대로 구현하면 된다. 다만, 배열의 인덱스를 벗어나지 않게 조심하자!

문제 풀이

첫 번째 접근

그냥 그대로 구현하면 되는데, 시계 방향으로 돌리는 방법은 문제에 쓰여 있으니 반 시계방향으로 돌리는 방법을 설명하겠다.

1. X의 주 대각선을 가운데 행으로 옮긴다.

tmp[n//2][i] = X[i][i]

2. X의 가운데 열을 주 대각선으로 옮긴다.

tmp[i][i] = X[i][n // 2]

3. X의 부 대각선을 가운데 열로 옮긴다.

tmp[i][n//2] = X[i][(n - 1) - i]

4. X의 가운데 행을 X의 부 대각선으로 옮긴다.

tmp[(n-1)-i][i] = X[n // 2][i]

코드

import sys


def clockWise(n, X):
    tmp = [[0 for i in range(n)] for j in range(n)]

    for i in range(n):
        for j in range(n):
            tmp[i][j] = X[i][j]

    for i in range(n):
        # X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
        tmp[i][n//2] = X[i][i]
        # X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다.
        tmp[i][(n - 1) - i] = X[i][n // 2]
        # X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
        tmp[n // 2][i] = X[(n - 1) - i][i]
        # X의 가운데 행을 X의 주 대각선으로 옮긴다.
        tmp[i][i] = X[n // 2][i]

    return tmp


def antiClockWise(n, X):
    tmp = [[0 for i in range(n)] for j in range(n)]

    for i in range(n):
        for j in range(n):
            tmp[i][j] = X[i][j]

    for i in range(n):
        # X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데  행 ((n+1)/2 번째 행)로 옮긴다.
        tmp[n//2][i] = X[i][i]
        # X의 가운데 열을 X의 주 대각선으로 ((1, 1), (2, 2), …, (n, n)) 옮긴다.
        tmp[i][i] = X[i][n // 2]
        # X의 부 대각선을 X의 가운데 열 ((n+1)/2번째 열)으로 옮긴다.
        tmp[i][n//2] = X[i][(n - 1) - i]
        # X의 가운데 행을 X의 부 대각선으로 옮긴다.
        tmp[(n-1)-i][i] = X[n // 2][i]

    return tmp


t = int(sys.stdin.readline().rstrip(" "))

for _ in range(t):

    n, degree = map(int, sys.stdin.readline().split(" "))
    X = []

    for j in range(n):
        X.append(list(map(int, sys.stdin.readline().split(" "))))

    degree //= 45
    if degree < 0:
        degree *= -1
        for k in range(degree):
            X = antiClockWise(n, X)
        # printX(X)
    else:
        for k in range(degree):
            X = clockWise(n, X)
        # printX(X)

    for i in range(n):
        for j in range(n):
            print(X[i][j], end=' ')
        print()

여담

참고로 출력할 때 최종 X를 보여줘야 한다. 계속해서 보여주다간 나처럼 출력 초과가 날지도... ㅋㅋㅋㅋ

'algorithm > 코딩 테스트' 카테고리의 다른 글

배열 돌리기 3  (0) 2023.06.01
아기 상어(백준 16236, python)  (0) 2023.05.29
백준(20291), 파일 정리 python  (0) 2023.05.22
문자열 압축(python), kakao  (1) 2023.05.13
무지의 먹방 라이브(python)  (0) 2023.05.12