Programming/Algorithm

[백준/python] 16926번 배열 돌리기 1

dev seon 2024. 5. 18. 17:33

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. 결과

 

오랜만에 풀어본 복잡한 구현 문제..

주기적으로 풀어서 감을 잃지 말아야겠다.