깡뇽

[백준] 16926번 배열 돌리기1 파이썬 본문

Algorithm/BAEKJOON

[백준] 16926번 배열 돌리기1 파이썬

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

NxM 크기 배열 

반시계 방향 돌리기

ex) 배열 2번 회전

 

- 입력

1줄 : N, M, R (R은 회전의 수)

2~N줄 : 배열 A의 원소 Aij

 

- 출력

배열을 R번 회전시킨 결과

 

- 제한

2 ≤ N, M ≤ 300

1 ≤ R ≤ 1,000

min(N, M) mod 2 = 0

1 ≤ Aij ≤ 10^8

16926번 배열 돌리기1

n, m, r = map(int, input().split())

a = []
new_a = [[0]*m for i in range(n)]

for _ in range(n):
  a.append(list(map(int, input().split())))

for i in range(n):
    for j in range(m):
      rest_i = (i+r) % n
      rest_j = (m+r) % m
      if j == 1 or j == m:
        if i + r <= n:
          new_a[i+r][j] = a[i][j]
        else:

 

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

입력을 받고 배열A를 R바퀴 회전시킨다.

회전되어서 변경된 인덱스를 가지는 값들을 0으로 초기화되어있는 이중 배열에 변경된 위치 인덱스를 사용해 넣어준다.

반복문에서 j가 m보다 작거나 같을 때에는 j에 회전값을 더하지만 클 때는 나눗셈 나머지를 활용해서 이동시킴...?


2. 어디서 막혔는가

회전할 때에 한 층씩 관여됨.

만약 홀수x홀수이면 가장 중앙은 어떻게 되는가..

=> 한겹씩 따로 뗴어서 생각하자..!

한 겹을 제거하면 n-2와 m-2가 됨.

n과 m 중에서 작은 값을 2로 나눈 것만큼의 겹이 있음.

 

3. 코드를 보고 개선한 방향

import sys

def rotate():
    x, y = 0, 0
    n, m = N, M
    time = min(N, M) // 2

    while time:
        first_value = board[x][y]

        # 윗쪽
        for i in range(m - 1):
            board[x][y + i] = board[x][y + i + 1]
        # 오른쪽
        for i in range(n - 1):
            board[x + i][y + m - 1] = board[x + i + 1][y + m - 1]
        # 아래쪽
        for i in range(m - 1):
            board[x + n - 1][y + m - 1 - i] = board[x + n - 1][y + m - 2 - i]
        # 왼쪽
        for i in range(n - 1):
            board[x + n - 1 - i][y] = board[x + n - 2 - i][y]
        
        board[x + 1][y] = first_value

        n -= 2
        m -= 2
        x += 1
        y += 1
        time -= 1

def getResult():
    for _ in range(R):
        rotate()

    for row in board:
        print(*row)

N, M, R = list(map(int, sys.stdin.readline().split()))
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

getResult()

한 층에서 위, 오, 아, 왼 순서대로 한 줄 씩 이동할 떄에 한 칸씩 비우고 이동.

맨 처음 왼쪽에서 비운자리는 first_value로 for 반복문으로 이동할 수 없어서 별도로 이동시킴.

n과 m 사용 주의.

 

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

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

 

참고 : https://handhand.tistory.com/185

 

BOJ 16926 - 배열 돌리기 1

문제 백준 온라인 저지 - 16926번 풀이 과정 배열을 회전하는 로직을 구현하는 문제입니다. python 으로 제출하니 시간초과가 발생하여 pypy3 로 제출했습니다. 코드 import sys def rotate(): x, y = 0, 0 n, m =.

handhand.tistory.com

 

반응형