배열의 이동과 회전 기본기 다지기

임규성·2022년 11월 14일
1
post-custom-banner

동기

프로그래머스의 자물쇠와 열쇠 문제가 있다. (-> 링크 <-)
이문제를 풀려 하는데 배열의 기본기가 부족해 기본적인 배열의 회전 이동을
해보고자 한다.

회전

회전은 단순하다
3 X 3 배열
1 1 1
0 0 0
1 1 1 <- 이 있을 때

시계방향 회전을 하면
1 0 1
1 0 1
1 0 1 <- 이 될 것이다.

이동

이동은 상하좌우 이동할 것이다
1 0 1
1 1 0
0 1 1 <-이걸 상으로 1칸 이동한다면

1 1 0
0 1 1
0 0 0 <-이 될 것이다.

구현

회전 코드

import sys
import copy

size = int(input('사이즈를 입력해주세요 : '))

matrix = []

for i in range(size):
  matrix.append(list(map(int, input().split())))

print('기존 matrix')

for i in range(size):
  for j in range(size):
    print(matrix[i][j], end = ' ')
  print()

#시계방향회전 시키기
for k in range(3):
  tmp = copy.deepcopy(matrix)

  for i in range(size):
    for j in range(size):
      tmp[j][size-1-i] = matrix[i][j]
  
  matrix = copy.deepcopy(tmp)
  #출력
  print('시계방향 ',k+1, '번 회전 후', end = '')
  print()
  for i in range(size):
    for j in range(size):
      print(matrix[i][j], end = ' ')
    print()

#반시계방향회전 시키기
for k in range(3):
  tmp = copy.deepcopy(matrix)

  for i in range(size):
    for j in range(size):
      tmp[i][j] = matrix[j][size-1-i]
      
  matrix = copy.deepcopy(tmp)
   #출력
  print('반시계방향', k+1, '번 회전 후', end = '')
  print()
  for i in range(size):
    for j in range(size):
      print(matrix[i][j], end = ' ')
    print()

솔직히 처음 구현 했을 때 같은 방식으로 구현이 안되었지만
깊은 복사 deep copy를 사용하니 문제가 해결 되었다.

이동 코드

이동은 단순해 보이지 않는다
삽질을 많이했다 ㅠㅠㅠ
결국에는 직접 tmp배열 즉 옮겨졌을 때 결과물인 리스트를
순차적으로 차곡차곡 쌓아간게 덜 햇갈리고 잘 해결되었다.

import sys
import copy

size = int(input('사이즈를 입력해주세요 : '))

matrix = []


for i in range(size):
  matrix.append(list(map(int, input().split())))

print('기존 matrix')
for i in range(size):
      for j in range(size):
        print(matrix[i][j], end = ' ')
      print()

for ud in range(-size+1, size):
  for lr in range(-size+1, size):
    tmp = [[0] * size for _ in range(size)]
    #위로 이동
    if ud < 0:
      for i in range(size):
        for j in range(size):
          #진짜 이동해야할 때
          if(i <= size -1 + ud):
            tmp[i][j] = matrix[i-ud][j]
          #0으로 초기화 해줘야 할때
          else:
            tmp[i][j] = 0
          
      
    #아래로 이동
    else:
      for i in range(size):
        for j in range(size):
          if(i >= ud):
            tmp[i][j] = matrix[i-ud][j]
          else:
            tmp[i][j] = 0
            
      
    #왼쪽으로 이동
    if lr < 0:
      for i in range(size):
        for j in range(size):
          if(j <= size - 1 + lr):
            tmp[i][j] = tmp[i][j-lr]
          else:
            tmp[i][j] = 0
    #오른쪽으로 이동
    else:
      for i in range(size):
        for j in range(size):
          if(j >= lr):
            tmp[i][j] = tmp[i][j-lr]
          else:
            tmp[i][j] = 0

    #출력
    print('상하로', ud, '옆으로', lr, '이동!!!')
    for i in range(size):
      for j in range(size):
        print(tmp[i][j], end = ' ')
      print()
        
      
profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글