본문 바로가기

ALGO

[백준 BOJ] 16935 17470 배열 돌리기 3, 5 (python)

문제 링크 : https://www.acmicpc.net/problem/16935

문제 링크 : https://www.acmicpc.net/problem/17470

 

1, 2로 마찬가지지만 종류가 다양한 구현 문제입니다.

 

매 과정에서 배열을 직접 바꾸는 과정을 진행하면 시간이 많이 걸리므로 stat이라는 리스트를 조절한 후 그 결과만 배열에 적용해주는 방식을 사용하였습니다.

stat = [rotate 여부, 1그룹, 2그룹, 3그룹, 4그룹, flip 여부 (좌우)]

 

각 연산 과정이 stat을 어떻게 변경해주는지 설명해드리겠습니다.

- 1번 연산

우선 1, 4와 2, 3 그룹의 위치를 swap 함수를 통해 바꿔줍니다.

rotate가 0, 2인 경우는 상하 flip을 해야하는데 rotate를 두번 한 후 좌우 flip을 하는 과정이 곧 상하 flip이 됩니다.

rotate가 1, 3인 경우는 이 상황에서의 상하 flip이 사실상 좌우 flip이기에 flip stat만 바꾸어줍니다.

- 2번 연산

우선 1, 2와 3, 4 그룹의 위치를 swap 함수를 통해 바꿔줍니다.

rotate가 0, 2인 경우는 좌우 flip이기에 flip stat만 바꾸어줍니다.

rotate가 1, 3인 경우는 이 상황에서의 좌우 flip이 사실상 상하 flip이기에 rotate를 두번 한 후 flip을 해줍니다.

- 3번 연산

1, 2, 3, 4 그룹의 위치를 하나씩 시계방향으로 돌려주고 rotate를 한번 더해줍니다.

- 4번 연산

1, 2, 3, 4 그룹의 위치를 하나씩 반시계방향으로 돌려주고 rotate를 한번 빼줍니다.

- 5번 연산 

1, 2, 3, 4 그룹의 위치를 하나씩 시계방향으로 돌려줍니다.

- 6번 연산

1, 2, 3, 4 그룹의 위치를 하나씩 반시계방향으로 돌려줍니다.

 

위 과정으로 stat을 정해준뒤 arrs 리스트에 배열을 그룹별로 나누어 줍니다.

그 후 new_arrs 리스트에 각 그룹에 알맞은 그룹을 알맞게 flip과 rotate을 rot 함수를 통해 진행해 줍니다.

이후 new_arrs를 적절한 방식으로 출력해주시면 됩니다.

 

3번과 5번의 차이는 R의 크기 차이로 시간복잡도를 더욱 고려해주셔야 합니다.

그러므로 이러한 풀이 방식을 통해서 시간복잡도를 줄일 수 있었습니다.

import sys

def swap(x, y):
    global stat
    temp = stat[x]
    stat[x] = stat[y]
    stat[y] = temp

def rot(arr, turn, flip):
    if flip:
        for i in range(len(arr)):
            arr[i] = arr[i][::-1]
    for _ in range(turn):
        arr = list(map(list, zip(*arr[::-1])))
    return arr

N, M, R = map(int, sys.stdin.readline().rstrip().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, sys.stdin.readline().rstrip().split())))
stat = [0, 1, 2, 3, 4, 0]
Rs = list(map(int, sys.stdin.readline().rstrip().split()))
for work in Rs:
    if work == 1:
        swap(1, 4)
        swap(2, 3)
        if stat[0] == 0:
            stat[0] = 2
        elif stat[0] == 2:
            stat[0] = 0
        stat[5] = 1 - stat[5]
    elif work == 2:
        swap(1, 2)
        swap(3, 4)
        if stat[0] == 1:
            stat[0] = 3
        elif stat[0] == 3:
            stat[0] = 1
        stat[5] = 1 - stat[5]
    elif work == 3 or work == 5:
        temp = stat[4]
        stat[4] = stat[3]
        stat[3] = stat[2]
        stat[2] = stat[1]
        stat[1] = temp
        if work == 3:
            stat[0] += 1
            if stat[0] == 4:
                stat[0] = 0
    elif work == 4 or work == 6:
        temp = stat[1]
        stat[1] = stat[2]
        stat[2] = stat[3]
        stat[3] = stat[4]
        stat[4] = temp
        if work == 4:
            stat[0] -= 1
            if stat[0] == -1:
                stat[0] = 3
arrs = [[],[],[],[]]
for i in range(N//2):
    arrs[0].append(arr[i][:M//2])
    arrs[1].append(arr[i][M//2:])
for i in range(N//2, N):
    arrs[3].append(arr[i][:M//2])
    arrs[2].append(arr[i][M//2:])
new_arrs = [[],[],[],[]]
for i in range(4):
    new_arrs[i] = rot(arrs[stat[i+1]-1], stat[0], stat[5])
if stat[0] % 2:
    x = M // 2
else:
    x = N // 2
for i in range(x):
    print(*(new_arrs[0][i] + new_arrs[1][i]))
for i in range(x):
    print(*(new_arrs[3][i] + new_arrs[2][i]))