시뮬레이션 - 격자 안에서 밀고 당기기
밀고 당기는 작업이란, 주어진 숫자들을 특정 방향으로 1칸씩 미는 작업을 말한다. 2차원 격자에서는 선택된 행에 대해, 적혀있는 숫자들을 왼쪽 혹은 오른쪽으로 한 칸씩 밀어주는 작업이 될 수 있고, 혹은 선택된 열에 대해 적혀있는 숫자들을 위 혹은 아래 방향으로 한 칸씩 밀어주는 작업이 될 수도 있다.
예를 들어, 오른쪽으로 한 칸씩 숫자들을 밀어준다고 해보자.
# 1. n번째 원소를 temp에 저장
temp = a[n - 1]
# 2. 나머지 원소를 오른쪽으로 shift
for i in range(n - 1, 0, -1):
a[i] = a[i - 1]
# 3. temp를 첫 번째 원소에 기록
a[0] = temp
2차원 격자가 주어졌을 때 위쪽으로 숫자들을 한 칸씩 당기는 작업도 비슷하게 진행이 가능하다.
temp = a[0][col]
for row in range(n - 1):
a[row][col] = a[row + 1][col]
a[n - 1][col] = temp
예시 문제 - 컨베이어 벨트
시계 방향으로 한 칸씩 회전하는 컨베이어 벨트가 있습니다. 컨베이어 벨트 위아래로 n개씩 총 2 * n 개의 숫자가 두 줄로 적혀 있고, 1초에 한 칸씩 움직입니다.
위의 그림에서 1초가 흐른 뒤에는 다음과 같이 그림이 바뀌게 됩니다.
t초의 시간이 흐른 뒤 컨베이어 벨트에 놓여있는 숫자들의 상태를 출력하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에는 n과 t가 공백을 사이에 두고 주어집니다.
두 번째 줄에는 위 변에 있는 초기 n개의 숫자들이 공백을 사이에 두고 주어집니다.
세 번째 줄에는 아래 변에 있는 초기 n개의 숫자들이 공백을 사이에 두고 주어집니다.
숫자는 각 변마다 숫자가 올바르게 보이는 방향에서 바라봤을 때 왼쪽에서 오른쪽 순으로 주어집니다.
- 1 ≤ n ≤ 200
- 1 ≤ t ≤ 1,000
- 1 ≤ 주어지는 숫자 ≤ 9
출력 형식
t초 후 컨베이어 벨트에 놓여있는 숫자들의 상태를 출력합니다.
첫 번째 줄에는 위 위 변에 있는 n개의 숫자들을 공백을 사이에 두고 출력합니다.
두 번째 줄에는 아래 변에 있는 n개의 숫자들을 공백을 사이에 두고 출력합니다.
숫자는 각 변마다 입력으로 주어지는 순서대로 출력합니다.
입출력 예제
예제1
입력:
3 1
1 2 3
6 5 1
출력:
1 1 2
3 6 5
예제2
입력:
3 3
1 2 3
6 5 1
출력:
6 5 1
1 2 3
제한
시간 제한: 1000ms
메모리 제한: 80MB
코드
# 변수 선언 및 입력
n, t = tuple(map(int, input().split()))
u = list(map(int, input().split()))
d = list(map(int, input().split()))
for _ in range(t):
# Step 1
# 위에서 가장 오른쪽에 있는 숫자를 따로 temp값에 저장해놓습니다.
temp = u[n - 1]
# Step 2
# 위에 있는 숫자들을 완성합니다.
# 오른쪽에서부터 채워넣어야 하며,
# 맨 왼쪽 숫자는 아래에서 가져와야함에 유의합니다.
for i in range(n - 1, 0, -1):
u[i] = u[i - 1]
u[0] = d[n - 1]
# Step 3
# 아래에 있는 숫자들을 완성합니다.
# 마찬가지로 오른쪽에서부터 채워넣어야 하며,
# 맨 왼쪽 숫자는 위에서 미리 저장해놨던 temp값을 가져와야함에 유의합니다.
for i in range(n - 1, 0, -1):
d[i] = d[i - 1]
d[0] = temp
# 출력
for elem in u:
print(elem, end=" ")
print()
for elem in d:
print(elem, end=" ")
'BASE > Coding Test' 카테고리의 다른 글
[Code Tree] 시뮬레이션 - 격자 안에서 완전탐색 (0) | 2023.05.22 |
---|
댓글