1. 문제
이 문제는 배열을 반시계 방향으로 R번 회전시킨 결과를 구해 출력하는 문제이다.
2. 풀이
귀찮고 오래 걸릴 것 같은 구현 문제였다.
풀기 싫어서 이틀은 미루었다..ㅠㅠ
배열에서 어느 위치에 있느냐에 따라 돌렸을 때 자리까지 돌아오는 횟수가 달라진다.
최대한 시간을 줄이기 위해 꼭 필요한 만큼만 돌려야겠다는 생각을 했다.
즉, 다시 자기 자리에 돌아와 한 바퀴 회전하는 경우를 빼야 한다는 것.
전체 길이로 돌리는 횟수를 나눈 나머지 만큼만 돌리면 된다.
2차원 배열로는 어려워서 1차원 배열로 바꾸기로 정했다.
좀 지저분하지만 각각의 그룹을 모두 분리해냈고,
그 뒤에 1차원 배열 내에서 돌리기를 쉽게 수행했다.
그 뒤 다시 2차원 배열로 바꾸어 출력해주었다.
3. 코드
n, m, r = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
num = min(n//2, m//2) # 그룹의 개수
group = []
# 1차원 배열로 만들기
for i in range(num):
top_row = arr[i][i:m-i]
right_col = [arr[j][m-i-1] for j in range(i+1, n-i-1)]
bottom_row = arr[n-i-1][i+1:m-i][::-1]
left_col = [arr[j][i] for j in range(n-i-1, i, -1)]
group.append(top_row + right_col + bottom_row + left_col)
# r회 돌리기
for i in range(num):
a = r % len(group[i])
group[i] = group[i][a:] + group[i][:a]
# 2차원 배열로 다시 만들기
for i in range(num):
idx = 0
# 위쪽 행
for j in range(i, m-i):
arr[i][j] = group[i][idx]
idx += 1
# 오른쪽 열
for j in range(i+1, n-i-1):
arr[j][m-i-1] = group[i][idx]
idx += 1
# 아래쪽 행
for j in range(m-i-1, i-1, -1):
arr[n-i-1][j] = group[i][idx]
idx += 1
# 왼쪽 열
for j in range(n-i-2, i, -1):
arr[j][i] = group[i][idx]
idx += 1
# 출력
for row in arr:
print(' '.join(map(str, row)))
4. 결과
오랜만에 풀어본 복잡한 구현 문제..
주기적으로 풀어서 감을 잃지 말아야겠다.
'Programming > Algorithm' 카테고리의 다른 글
[백준/python] 16948번 데스 나이트 (bfs vs heapq) (0) | 2024.05.23 |
---|---|
[백준/python] 15988번 1, 2, 3, 더하기 3 (0) | 2024.05.22 |
[백준/python] 14391번 종이조각 (1) | 2024.05.14 |
[알고리즘] 비트마스킹 (0) | 2024.05.14 |
[백준/python] 1141번 접두사 (0) | 2024.05.11 |