문제


세로 길이 N, 가로 길이 M 인 2차원 배열이 주어진다.

이 배열의 테두리가 시계방향으로 한 칸 씩 밀린 배열을 출력하여라.

여기서 테두리란 배열의 상하좌우 끝 줄을 의미한다.

입력


첫 줄에 N, M 이 주어진다.

두 번째 줄부터 N 줄에 걸쳐 각 줄에 M 개씩 배열의 수가 주어진다.

(3 ≤ N, M ≤ 100, 1 ≤ 수열을 구성하는 수 ≤ N x M)

출력


밀기가 끝난 배열을 출력한다.

입력의 예 1

3 5
2 3 1 1 4
1 3 2 3 4
1 2 7 3 7

출력의 예 1

1 2 3 1 1
1 3 2 3 4
2 7 3 7 4

입력의 예 2

4 4
1 2 4 2
3 4 1 7
8 3 1 6
9 8 9 7

출력의 예 2

3 1 2 4
8 4 1 2
9 3 1 7
8 9 7 6

입력의 예 3

3 5
1 3 4 2 4
1 2 5 8 7
6 4 5 2 7

출력의 예 3

1 1 3 4 2
6 2 5 8 4
4 5 2 7 7

입력의 예 4

6 5
7 1 3 5 4
2 3 4 8 3
2 1 4 7 9
9 8 5 3 1
2 3 6 7 4
1 4 3 2 5

출력의 예 4

2 7 1 3 5
2 3 4 8 4
9 1 4 7 3
2 8 5 3 9
1 3 6 7 1
4 3 2 5 4

 

풀이

 - 오른쪽 상단, 오른쪽 하단, 왼쪽 하단, 왼쪽 상단을 각각 플래그로 삼고(시계방향)

 - 각 꼭지점에 도달하는 경우 x, y 좌표 증가 또는 감소

 - 시작은 0, 1에서부터 시작하고

 - 오른쪽 끝(0)에 도달할때 까지 y값 증가

 - 오른쪽 하단(1)에 도달할 때 까지 x값 증가

 - 왼쪽 하단(2)에 도달할떄 까지 y값 감소

 - 왼쪽 상단(1)에 도달할 떄 까지 x값 증가

 - 내부 값은 이전껄로 현재를 덮고, 현재꺼는 다시 prev에 저장해서 다음에 씀 이런 느낌.....

def border_turn(row, colum) :
  vertext_x = [0, row-1, row-1, 0]            #오른쪽 상단, 오른쪽 하단, 왼쪽 하단, 왼쪽 상단(시계방향)
  vertext_y = [colum-1, colum-1, 0, 0]
  
  flag = 0                                                            #방향 전환을 위한 플러그 인덱스
  
  prev = data_list[0][0]
  next_x, next_y = 0, 1                                               #0, 1부터 시작
  
  while flag < 4 :                                                    
    if next_x == vertext_x[flag] and next_y == vertext_y[flag] :      #각 꼭지점에 도달한 경우 flag 1추가 해서 방향 전환
      flag += 1
    # temp = data_list[next_x][next_y]    #현재 저장
    # data_list[next_x][next_y] = prev    #현재에 이전껄저장
    # prev = temp                         #이전꺼에 현재꺼 저장
    
    data_list[next_x][next_y], prev = prev, data_list[next_x][next_y]     #이전껄로 현재를 덮고, 현재꺼는 다시 prev에 저장해서 다음에 씀
    
    if flag == 0 :
      next_y += 1
    if flag == 1 :
      next_x += 1
    if flag == 2 :
      next_y -= 1
    if flag == 3:
      next_x -= 1
      
if __name__ == "__main__":
  row, colum = map(int, input().split())
  data_list = []

  for i in range(row) :
    data_list.append(list(map(int, input().split())))
  
  border_turn(row, colum)                                       #row, colum받아서 테두리 회전
  
  for i in range(row) :
    print(" ".join(map(str, data_list[i])))                     #출력
공기청정기-2차원 밀기(이차원 리스트 시계방향 테두리 회전)