[ProblemSolving] 백준 - 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]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
제한
2 ≤ N, M ≤ 300
1 ≤ R ≤ 1,000
min(N, M) mod 2 = 0
1 ≤ Aij ≤ 10^8
예제 입력1
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
예제 출력1
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
나의 풀이
배열을 r만큼 반시계 방향으로 돌리는 문제다.
제한 조건에서 min(N, M) mod 2 = 0
은 가장 작은 값이 항상 2의 배수란 의미.. 3x4 라면 회전불가한 부분이 생긴다.
코드 순서
- 테두리 개수 세기 -> cnt = min(n,m) //2
- 반복문을 통해 테두리 개수 만큼 회전한다.
- 회전 시작하는 지점은 다른 변수에 저장
- 다른 곳은 반시계 방향 회전
- 회전 시작 지점 회전 반영
코드
n, m, r = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
def solution():
for _ in range(r):
rotate()
for i in graph:
for j in i:
print(j, end=" ")
print()
# 5 * 4
def rotate():
cnt = min(n,m) // 2 # 2
for i in range(cnt): # (0, 1)
nn = n- i -1 # 5 -1 = 4
mm = m -i -1 # 4- 1 =3
start = graph[i][i] #
# 위쪽 가로 : 왼 <- 오
for j in range(i , mm):
graph[i][j] = graph[i][j+1]
# 오른쪽 세로 : 아래 <- 위
for j in range(i, nn):
graph[j][mm] = graph[j+1][mm]
# 아래쪽 가로 : 왼 -> 오
for j in range(mm, i, -1):
graph[nn][j] = graph[nn][j-1]
# 왼쪽 세로 : 위 -> 아래
for j in range(nn, i, -1):
graph[j][i] = graph[j-1][i]
graph[i+1][i] = start
solution()
Author And Source
이 문제에 관하여([ProblemSolving] 백준 - 16926 배열돌리기1(구현>행렬)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@redcarrot01/ProblemSolving-백준-16926-배열돌리기1dp저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)