본문 바로가기
Algorithm/Baekjoon

16935_배열 돌리기3

by 모너아링 2025. 2. 24.

▶ 골드 5 (구현)

풀이

삽질 너무 많이한 문제입니다..

일단 처음에 1 ~ 6번 다 나눠서 규칙을 찾았습니다.

찾은 규칙으로 이중 for문 돌려서 swap 하면 된다고 생각했는데..

그렇게 하니까 한 인덱스 당 swap을 두 번 돌아서 제자리로 돌아오게 되었습니다......


그 다음으로 생각한 게, 이중 for문 돌려서 규칙에 따라 즉시 print

근데 이렇게 하니까 연산 과정이 한 번이면 성공하는데 여러 개일 경우 모든 경우가 다 출력되었습니다......


저의 멍청함에 놀라던 중, 마지막으로 생각한 게 연산을 한 번 할 때 규칙에 맞는 새로운 배열을 생성하고,

연산이 끝나면 그 새로운 배열을 원 배열로 갱신해는 방식이었습니다.

그리고 모든 연산이 끝나고 마지막에 배열을 출력하였습니다.

 

 

처음에는 배열 '돌리기' 라는 단어에 꽂혀 숫자끼리 swap 해야한다는 생각에 swap할 순서를 정하기도 하고 갖가지 방법을 생각했지만

해결책은 그게 아니라 현재 숫자에 대응하는 숫자만 찾으면 되는 직관적인 문제였습니다.

 

규칙 찾은 방법

# 1번 (상하 반전)
# arr[n - i - 1][j]
# 위쪽 절반만

# 2번 (좌우 반전)
# arr [i][m - j - 1]
# 왼쪽 절반만

# 3번 (오른쪽 90도 회전)
# (0, 0) <-> (n - 1, 0) <-> (n - 1, m - 1) <-> (n - 1, 0)
# (0, 1) <-> (n - 2, 0) <-> (n - 1, m - 2)
# arr[j][m - i - 1]

# 4번 (왼쪽 90도 회전)
# arr[n - j - 1][i]

# 5번 (시계 90도 회전)
# 1번: (i, j) -> (i, j + m / 2) []
# 2번: (i, j) -> (i + n / 2, j) [j + 2 / m > m]
# 3번: (i, j) -> (i, j - n / 2) [i + 2 / n > n && j + 2 / m > m]
# 4번: (i, j) -> (i - n / 2, j) [i + 2 / n > n]

# 6번
# 1번: (i, j) -> (i + n / 2, j + m / 2)
# 2번: (i, j) -> (i, j - m / 2)
# 3번: (i, j) -> (i - n / 2, j + m / 2)
# 4번: (i, j) -> (i, j - m / 2)

 

1번 & 2번

상하 / 좌우 반전은 각각 n, m 값에서 현재 인덱스 값을 뺀 값.

0 ~ n - 1 / m - 1 이므로항상 - 1은 꼭 붙여줘야합니다.

 

3번 & 4번

이 규칙 찾는게 조금 까다로웠습니다.

a, b가 있을 때, a의 col 값이 b의 row 값에 영향을 미치고, a의 row 값이 b의 col 값에 영향을 미치는 것을 발견했습니다.

따라서 각각 arr[j][m - i - 1] / arr[n - j -1][i] 의 식을 찾을 수 있었습니다.

 

5번 & 6번

i, j 에 +- n // 2 , +- m // 2 만 해주면 되었기 때문에 규칙 찾기는 쉬웠지만,

사분면 별로 식이 달랐기 때문에 조건문을 어떻게 처리할지 고민이 많았습니다.

결국 모든 경우에 if문을 사용했지만 더 좋은 방법이 있을듯 합니다..

 

코드

# 16935_배열 돌리기3
import sys
input = sys.stdin.readline

n, m, r = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
a_list = list(map(int, input().split()))

for _ in range(max(n, m) - min(n, m)):
    arr.append([0] * m)

for a in range(len(a_list)):
    new_arr = []
    # 1번 (상하 반전)
    if a_list[a] == 1:
        for i in range(n):
            new_col = []
            for j in range(m):
                new_col.append(arr[n - i - 1][j])
            new_arr.append(new_col)

    # 2번 (좌우 반전)
    elif a_list[a] == 2:
        for i in range(n):
            new_col = []
            for j in range(m):
                new_col.append(arr[i][m - j - 1])
            new_arr.append(new_col)

    # 3번 (오른쪽 90도 회전)
    elif a_list[a] == 3:
        for i in range(m):
            new_col = []
            for j in range(n):
                new_col.append(arr[n - j - 1][i])
            new_arr.append(new_col)
        n, m = m, n

    # 4번 (왼쪽 90도 회전)
    elif a_list[a] == 4:
        for i in range(m):
            new_col = []
            for j in range(n):
                new_col.append(arr[j][m - i - 1])
            new_arr.append(new_col)
        n, m = m, n

    # 5번 (사분면 시계 방향 회전)
    elif a_list[a] == 5:
        for i in range(n):
            new_col = []
            for j in range(m):
                if i < n // 2:
                    if j < m // 2:
                        # 1 사분면
                        new_col.append(arr[i + n // 2][j])
                    else:
                        # 2 사분면
                        new_col.append(arr[i][j - m // 2])
                else:
                    if j >= m // 2:
                        # 3 사분면
                        new_col.append(arr[i - n // 2][j])
                    else:
                        # 4 사분면
                        new_col.append(arr[i][j + m // 2])
            new_arr.append(new_col)

    # 6번 (사분면 반시계 방향 회전)
    else:
        for i in range(n):
            new_col = []
            for j in range(m):
                if i < n // 2:
                    if j < m // 2:
                        # 1 사분면
                        new_col.append(arr[i][j + m // 2])
                    else:
                        # 2 사분면
                        new_col.append(arr[i + n // 2][j])
                else:
                    if j >= m // 2:
                        # 3 사분면
                        new_col.append(arr[i][j - m // 2])
                    else:
                        # 4 사분면
                        new_col.append(arr[i - n // 2][j])
            new_arr.append(new_col)

    arr = new_arr

for i in range(n):
    for j in range(m):
        print(arr[i][j], end=' ')
    print()

'Algorithm > Baekjoon' 카테고리의 다른 글

16719_ZOAC  (0) 2025.02.25
5014_스타트링크  (0) 2025.02.25
11057_오르막수  (0) 2025.02.24
16948_데스 나이트  (0) 2024.02.19
3584_가장 가까운 공통 조상  (0) 2023.08.07