1. 문제
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://www.acmicpc.net/problem/16927
16927번: 배열 돌리기 2
크기가 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
2. 접근 방법
구현인데용
ㅁ 이렇게 네모 테두리에서 위쪽, 오른쪽, 아래쪽, 왼쪽으로 나누어서
deque에 담고,
deque의 rotate를 사용해서 R만큼 옮겨주고
그 deque를 다시 board에 담습니다.
아이디어를 알면 쉽게 풀 수 있는데,
처음에 어떻게 구현할지 고민고민고민하는게 문제인 것 같습니다.
배열 돌리기1과 2는 문제가 거의 동일한데요,
입력되는 R 값의 범위만 다른 문제입니다.
제 풀이는 deque.rotate를 사용해서 R값의 범위의 변화에 큰 차이가 없어 동일한 코드로 풀이 할 수 있었습니다.
3. 코드
python
from collections import deque
def rotate_board(r):
global N, M, board
q = deque()
_width, _height = M, N
time = min(_width, _height) // 2
nx, ny = 0, 0
while time >= 1:
for i in range(_width-1):
q.append(board[ny][nx+i])
for i in range(_height-1):
q.append(board[ny+i][nx+_width-1])
for i in range(_width-1):
q.append(board[ny+_height-1][nx+_width-1-i])
for i in range(_height-1):
q.append(board[ny+_height-1-i][nx])
q.rotate(-r)
for i in range(_width-1):
board[ny][nx+i] = q.popleft()
for i in range(_height-1):
board[ny+i][nx+_width-1] = q.popleft()
for i in range(_width-1):
board[ny+_height-1][nx+_width-1-i] = q.popleft()
for i in range(_height-1):
board[ny+_height-1-i][nx] = q.popleft()
_width -= 2
_height -= 2
nx += 1
ny += 1
time = min(_width, _height) // 2
N, M, R = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
rotate_board(R)
for i in range(N):
print(*board[i])
4. 마치며
마치며~!
'Algorithm > Python' 카테고리의 다른 글
[python] 17684 압축 - 카카오 2018 1차 (0) | 2021.07.03 |
---|---|
[백준 2798] 블랙잭 (2) | 2021.06.25 |
[LeetCode] 39. Combination Sum (0) | 2021.06.07 |
[LeetCode] 200. Number of Islands (0) | 2021.06.07 |
[LeetCode] 232. Implement Queue using Stacks (0) | 2021.06.06 |