깡뇽

[백준] 16935번 배열 돌리기3 파이썬 본문

Algorithm/BAEKJOON

[백준] 16935번 배열 돌리기3 파이썬

깡뇽 2022. 10. 7. 05:17
반응형

NxM 크기 배열.

R번 연산.

1번 : 상하 반전 

2번 : 좌우 반점

3번 : 오른쪽으로 90 회전

4번 : 왼른쪽으로 90 회전

* 5 & 6번 연산 수행 시, N/2*M/2인 4개의 부분 배열로 나누어야 함.

5번 : 1->2 / 2->3 / 3->4 / 4->1

6번: 1->4 / 4->3 / 3->2 / 2->1

 

16935번 배열 돌리기3

n, m, r = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
operation = list(map(int, input().split()))

def cal1():
    temp_board = [[0] * m for _ in range(n)]
    for i in range(n):
        temp_board[i] = board[n-1-i]
    return temp_board
    
def cal2():
    temp_board = [[0] * m for _ in range(n)]
    for i in range(n):
        for j in range(m):
            temp_board[i][j] = board[i][m-1-j]
            return temp_board

def cal3(board, n, m):
    temp_board = [[0] * n for _ in range(m)]
    for i in range(m):
        for j in range(n):
            temp_board[i][j] = board[n-1-j][i]
    return temp_board
 
def cal4(board, n, m):
    temp_board = [[0] * n for _ in range(m)]
    for i in range(m):
        for j in range(n):
            temp_board[i][j] = board[j][m - 1 - i]
    return temp_board

def cal5():
    temp_board = [[0] * m for _ in range(n)]
    #1->2
    for i in range(n // 2):  
        for j in range(m // 2):
            temp_board[i][j + m // 2] = board[i][j]
    #2->3
    for i in range(n // 2): 
        for j in range(m // 2, m):
            temp_board[i + n // 2][j] = board[i][j]
    #3->4
    for i in range(n // 2, n): 
        for j in range(m // 2, m):
            temp_board[i][j - m // 2] = board[i][j]
    #4->1
    for i in range(n // 2, n):
        for j in range(m // 2):
            temp_board[i - n // 2][j] = board[i][j]
 
    return temp_board
  
def cal6():
    temp_board = [[0] * m for _ in range(n)]
    #1->4
    for i in range(n // 2):  
        for j in range(m // 2):
            temp_board[i + n // 2][j] = board[i][j]
    #4->3
    for i in range(n // 2, n): 
        for j in range(m // 2):
            temp_board[i][j + m // 2] = board[i][j]
    #3->2
    for i in range(n // 2, n): 
        for j in range(m // 2, m):
            temp_board[i - n // 2][j] = board[i][j]
    #2->1
    for i in range(n // 2):
        for j in range(m // 2, m):
            temp_board[i][j - m // 2] = board[i][j]
 
    return temp_board
    
for oper in operation:
    if oper == 1:
        board = cal1()
    elif oper == 2:
        board = cal2()
    elif oper == 3:
        board = cal3(board, n, m)
        n, m = m, n
    elif oper == 4:
        board = cal4(board, n, m)
        n, m = m, n
    elif oper == 5:
        board = cal5()
    else:
        board = cal6()

for row in board:
    print(*row)

1. 어디까지 고민을 했는가

1번 연산 : 행 그대로 두고 열만 이동

2번 연산 : 열 그대로 두고 행만 이동

 

2. 어디서 막혔는가

3번 연산 & 4번 연산 - 흠

5번 연산 & 6번 연산 - 어떻게 쪼개지..?

 

3. 어떻게 해결했는가

3번 연산 : n과 m을 바꿔서 적용. [a , b] -> [b , c]

4번 연산 : n과 m을 바꿔서 적용. [a , b] -> [c , b]

5번 연산 & 6번 연산 : 각 구간을 0~n//2, n//2~n, 0~m//2, m//2~m으로 쪼갠 후 이동.

 

출처 : https://www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

참고 : https://ywtechit.tistory.com/169

 

[ 파이썬(python) ] 백준 16935 - 배열 돌리기 3

📍 백준 16935 - 배열 돌리기 3 백준 16935 - 배열돌리기 3 ⚡️ 나의 풀이 2차원배열을 상하 , 좌우 , 시계 방향으로 90도 회전 , 반시계 방향으로 90도 회전 , 부분 배열 시계방향 회전 , 부분 배열 반

ywtechit.tistory.com

 

반응형