[BOJ] 16926. 배열 돌리기1 (🥈, 구현)

lemythe423·2023년 9월 6일
0

BOJ 문제풀이

목록 보기
44/133
post-thumbnail

문제

좀 까다로운 구현 문제였다. 처음엔 2차원 배열을 단순하게 90도로 회전하는 건줄 알고 zip을 사용하면 될 줄 알았는데 바깥에서부터 안쪽으로 각 단계별로 각각 따로 회전하는 문제였다 ㅠㅠ
어떻게 해야 될 지 감이 오긴 하는데 정말 그렇게 풀어도 되나를 모르겠어서 검색해서 힌트를 좀 참고했다...

풀이

2차원 풀이방식

  1. 일단 각 꼭지점에 닿게 되면 무언가 변경되어야 한다. 그게 이동하던 방향이던 증가하던 변수값이던. 꼭지점은 4개고 결국 4개의 조건문이 필요하다.
  2. 문제는 가장자리부터 안쪽으로 들어가는 각각의 레이어들을 어떻게 구분할 것이냐의 문제였는데, 일단 배열이 정사각형 형태는 아니지만 각 레이어들의 가장 왼쪽 위에 있는 지점은 모드 (0, 0), (1, 1), (2, 2) 등 같은 값을 가지는 형태를 띄게 된다. 몇 개의 레이어를 가지고 있느냐 = 몇 번이나 안쪽으로 들어가야 하느냐 = 즉, 몇 번의 반복문을 돌려야 하느냐의 계산으로 생각했다.

2차원풀이방식

import sys
input = sys.stdin.readline

N, M, R = map(int, input().split())
arr = [list(map(int, input().split())) for _  in range(N)]

t = min(N, M) // 2

endY, endX = N, M
for i in range(t):
    endX -= 1
    endY -= 1
    bord = (endX + endY - 2*i) * 2
    r = R % bord
    x = y = i
    for _ in range((bord-1) * r):
        if y == i and i <= x < endX:
            arr[y][x], arr[y][x+1] = arr[y][x+1], arr[y][x]
            x += 1
        elif i <= y < endY and x == endX:
            arr[y][x], arr[y+1][x] = arr[y+1][x], arr[y][x]
            y += 1
        elif y == endY and i < x <= endX:
            arr[y][x], arr[y][x-1] = arr[y][x-1], arr[y][x]
            x -= 1
        elif x == i and i < y <= endY:
            arr[y][x], arr[y-1][x] = arr[y-1][x], arr[y][x]
            y -= 1
    
for row in arr:
    print(*row)
profile
아무말이나하기

0개의 댓글