[BOJ-S2] 17276: 배열 돌리기

아이엠강욱·2023년 5월 16일
0

코딩테스트

목록 보기
9/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/17276


이번 문제 핵심인 부분 캡처했습니다.
결론은 이번문제를 해결하지 못했다.

사실 문제의 로직들은 전부 구현했지만 문제를 못푼 이유는 이전 데이터를 어디 임시저장소에 저장해야한다를 생각하지 못했다.
입력으로 받은 2차원 배열에 직접 접근해서 위 사진의 로직들을 구현하면 문제에서 요구하는 바를 만족시킬 수 없다.

로직 순서가 있기 때문에 각 로직에서 저장해야 하는 데이터들을 1차원 배열에 임시로 저장해놓는 것이 가장 중요하다.

"""
백준 17276 (S2): 배열 돌리기
https://www.acmicpc.net/problem/17276
"""

def rotate(matrix, n, d):
  rotate_count = abs(d) // 45   # 회전 횟수

  for _ in range(rotate_count):
    temp_list = []
    if d > 0:
      # (0) 주대각선 데이터 받아옴
      for i in range(n):
        temp_list.append(matrix[i][i])

      # (1) 주대각선에서 가운데로 이동
      for i in range(n):
        temp_data = matrix[i][n//2]   # 가운데 데이터
        matrix[i][n//2] = temp_list[i]   # temp_list에 저장되어있던 주대각선 데이터를 가운데로 이동시킴
        temp_list[i] = temp_data   # 가운데에 저장되어있던 데이터 temp_list에 저장
    
      # (2) 가운데에서 부대각선으로
      for i in range(n):
        temp_data = matrix[i][n-1-i]   # 부대각선 데이터
        matrix[i][n-1-i] = temp_list[i]   # temp_list에 저장되어있던 가운데 데이터를 부대각선으로 이동
        temp_list[i] = temp_data   # 부대각선 데이터 temp_list에 저장
    
      # (3) 부대각선에서 가운데-가로로
      for i in range(n):
        temp_data = matrix[n//2][n-1-i]   # 가운데-가로 데이터
        matrix[n//2][n-1-i] = temp_list[i]   # temp_list에 저장되어있던 부대각선 데이터를 가운데-가로로 이동
        temp_list[i] = temp_data   # 가운데-가로 데이터 temp_list에 저장

      # (4) 가운데-가로에서 주대각선으로
      for i in range(n):
        matrix[n-1-i][n-1-i] = temp_list[i]
    else:
      # (0) 주대각선 데이터 받아옴
      for i in range(n):
        temp_list.append(matrix[i][i])

      # (1) 주대각선에서 가운데-가로로 이동
      for i in range(n):
        temp_data = matrix[n//2][i]   # 가운데-가로 데이터
        matrix[n//2][i] = temp_list[i]   # temp_list에 저장되어있던 주대각선 데이터를 가운데-가로로 이동시킴
        temp_list[i] = temp_data   # 가운데-가로에 저장되어있던 데이터 temp_list에 저장
    
      # (2) 가운데-가로에서 부대각선으로
      for i in range(n):
        temp_data = matrix[n-1-i][i]   # 부대각선 데이터
        matrix[n-1-i][i] = temp_list[i]   # temp_list에 저장되어있던 가운데-가로 데이터를 부대각선으로 이동
        temp_list[i] = temp_data   # 부대각선 데이터 temp_list에 저장
    
      # (3) 부대각선에서 가운데-가로로
      for i in range(n):
        temp_data = matrix[n-1-i][n//2]   # 가운데-가로 데이터
        matrix[n-1-i][n//2] = temp_list[i]   # temp_list에 저장되어있던 부대각선 데이터를 가운데-가로로 이동
        temp_list[i] = temp_data   # 가운데-가로 데이터 temp_list에 저장

      # (4) 가운데-가로에서 주대각선으로
      for i in range(n):
        matrix[n-1-i][n-1-i] = temp_list[i]


  return matrix

t = int(input())  # 테스트 케이스 수

for i in range(t):
  n, d = map(int, input().split())  # n: 배열의 크기, d: 각도
  matrix = [list(map(int, input().split(' '))) for _ in range(n)]
  rotated_matrix = rotate(matrix, n, d)   # 회전

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

임시로 어디에 저장해놔야한다는 개념만 알고 있었으면 이번 문제는 조금 쉽게 풀었을지도...ㅎ

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글