격자 안에서 밀고 당기기 (진행 중)

HKTUOHA·2023년 12월 28일
0

코드트리

목록 보기
14/15
post-thumbnail

격자 안에서 특정 방향으로 한 칸씩 밀고 당기는 과정을 시뮬레이션하는 방법을 배우게 됩니다.



기본개념


🟢컨베이어 벨트

✏️격자 안에서 밀고 당기기

  • 밀고 당기는 작업 = 주어진 숫자들을 특정 방향으로 1칸씩 미는 작업
    Case 1. 주어진 배열을 왼쪽 혹은 오른쪽으로 한 칸 Shift
    Case 2. 주어진 배열을 위 혹은 아래 방향으로 한 칸 Shift

✏️밀어주는 방법 (예 : 오른쪽으로 한 칸)

1. temp 사용

  • 원소 유실을 방지하기 위해 미는 작업을 진행하기 전, 가장 오른쪽에 있는 원소를 미리 temp 변수에 담아준다.
  • 이 temp 값은 미는 작업을 진행한 후에 다시 첫 번째 원소에 넣어준다.

2. 밀어주는 방향

  • 오른쪽으로 밀어주기 위해서는 가장 끝 칸부터 앞으로 오며 순서대로 채워줘야 한다.
  • 앞에서부터 밀면 정보가 중간에 유실될 수 있다.
  • 오른쪽으로 밀기 = 오른쪽에서 당기기
# 1. n번째 원소를 temp에 저장
temp = arr[n -  1]

# 2. 나머지 원소를 오른쪽으로 shift
for i in range(n - 1, 0, -1):
	arr[i] = arr[i - 1]
    
# 3. temp를 첫 번째 원소에 기록
arr[0] = temp

✏️당겨주는 방법 (예 : 위쪽으로 한 칸)

  1. 유실될 수 있는 첫 번째 행 원소를 temp에 넣는다.
  2. 위에서 아래로 내려오며 한 칸씩 당겨준 뒤, 마지막 행에 temp 값을 넣어준다.
temp = arr[0][col]

for row in range(n - 1):
	arr[row][col] = arr[row + 1][col]
    
arr[n - 1][col] = temp

📌문제


📌나의 코드

n, t = map(int, input().split())
top = list(map(int, input().split()))
bottom = list(map(int, input().split()))

for _ in range(t):
    # 위 변 마지막, 아래 변 마지막 저장
    tmp1 = top[n - 1]
    tmp2 = bottom[n - 1]

    # 위 변과 아래 변 오른쪽으로 밀기
    for i in range(n - 1, 0, -1):
        top[i] = top[i - 1]
        bottom[i] = bottom[i - 1]

    # 위 변 마지막이 아래 변 처음으로,
    # 아래 변 마지막이 위 변 처음으로 이동
    top[0] = tmp2
    bottom[0] = tmp1

print(*top)
print(*bottom)

✏️개선점

  • 위 변 오른쪽 원소만 저장해서 사용하면 더 효율적이다.
  1. 위 변 먼저 오른쪽으로 밀고, 아래 변 오른쪽 원소를 위 변 왼쪽으로 가져온다.
  2. 아래 변을 오른쪽으로 밀고, 저장한 위 변 오른쪽 원소를 아래 변 왼쪽으로 가져온다.
profile
공부 기록

0개의 댓글