PS/코드트리
[코드트리 챌린지] 3주차 - Simulation (3)
행복한라이언
2023. 9. 23. 15:55
728x90
반응형
★ 핵심 : 격자 안에서 밀고 당기기
1. temp로 경계값 일시저장 후 오른쪽 또는 왼쪽 밀기
arr = [1, 2, 3, 4, 5]
n = 5
# 오른쪽으로 밀기(왼쪽에서 밀기)
# Step 1 - 오른쪽 경계값 저장
temp = arr[-1]
# Step 2 - 오른쪽 밀기
for i in range(n - 1, 0, -1):
arr[i] = arr[i - 1]
# Step 3
arr[0] = temp # [5, 1, 2, 3, 4]
# 왼쪽으로 밀기(오른쪽에서 밀기)
# Step 1 - 왼쪽 경계값 저장
temp = arr[0]
# Step 2 - 왼쪽으로 밀기
for i in range(n - 1):
arr[i] = arr[i + 1]
# Step 3
arr[-1] = temp # [2, 3, 4, 5, 1]
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int n = 5;
// 오른쪽으로 밀기 (왼쪽에서 밀기)
int temp = arr[n - 1];
for (int i = n - 1; i > 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = temp;
System.out.println(Arrays.toString(arr)); // [5, 1, 2, 3, 4]
// 왼쪽으로 밀기 (오른쪽에서 밀기)
temp = arr[0];
for (int i = 0; i < n - 1; i++) {
arr[i] = arr[i + 1];
}
arr[n - 1] = temp;
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
}
}
· 문제링크
https://www.codetree.ai/cote/13/problems/conveyor-belt?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
· 핵심
1. 컨베이어 벨트 이동시키기
2. d 벨트는 입력과 반대로 들어간다. 입력 받은 값 반대로 만들고 출력할 때 다시 원상복귀 시키기 위해서 또 반대로 해준다.
→ 입력 1 2 3 | 6 5 1
→ 그림 1 2 3 | 1 5 6
d = list(map(int, input().split()))[::-1]
#...
print(*d[::-1])
· 코드(Python)
n, t = map(int, input().split())
u = list(map(int, input().split()))
d = list(map(int, input().split()))[::-1]
def simulate():
global u, d
# Step 1 - u의 가장 오른쪽 숫자 / d의 가장 왼쪽 숫자 저장
temp_u = u[-1]
temp_d = d[0]
# Step 2 - 각 벨트 이동시키기
# u - 오른쪽으로 벨트 이동시키기
for i in range(n - 1, 0, -1):
u[i] = u[i - 1]
# d - 왼쪽으로 벨트 이동시키기
for i in range(n - 1):
d[i] = d[i + 1]
# Step 3
# temp_u가 d 벨트의 가장 오른쪽으로 이동
# temp_d가 u 벨트의 가장 왼쪽으로 이동
d[-1] = temp_u
u[0] = temp_d
for _ in range(t):
simulate()
print(*u)
print(*d[::-1])
· 코드(Java)
import java.io.*;
import java.util.*;
// 시간복잡도 O((t % 2n) * 2n)
public class Main {
public static int n, t;
public static final int MAX_N = 200;
public static int[][] belts = new int[2][MAX_N + 1];
public static void simulate(){
// 첫 번째 벨트의 가장 오른쪽 저장
// 두 번째 벨트의 가장 왼쪽 저장
int first_belt_temp = belts[0][n - 1];
int second_belt_temp = belts[1][0];
// 첫 번째 벨트 오른쪽으로 이동
for(int i = n - 1; i >= 1; i--){
belts[0][i] = belts[0][i - 1];
}
// 두 번째 벨트 왼쪽으로 이동
for(int i = 0; i < n - 1; i++){
belts[1][i] = belts[1][i + 1];
}
// 첫 번째 두 번째 벨트 이동 후 저장해놓은 값 기록
// 첫 번째 벨트의 가장 오른쪽 => 두 번째 벨드의 가장 오른쪽에 저장
// 두 번째 벨트의 가장 왼쪽 => 첫 번째 벨트의 가장 왼쪽에 저장
belts[1][n - 1] = first_belt_temp;
belts[0][0] = second_belt_temp;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
// 다시 돌아오는 주기
t = Integer.parseInt(st.nextToken());
t %= (2 * n);
// 두 번째 벨트는 입력의 반대로 배열이 만들어지며 출력할 때 다시 반대로, 즉 원상복귀시키서 출력해야함.
for(int r = 0; r < 2; r++){
st = new StringTokenizer(br.readLine());
if(r == 0){
for(int c = 0; c < n; c++){
belts[r][c] = Integer.parseInt(st.nextToken());
}
}
else{
for(int c = n-1; c >= 0; c--){
belts[r][c] = Integer.parseInt(st.nextToken());
}
}
}
// simulate() - 1초 회전 상태를 의미
for(int i = 0; i < t; i++){
simulate();
}
// 출력
for(int i = 0; i < n; i++){
System.out.print(belts[0][i] + " ");
}
System.out.println();
for(int i = n - 1; i >= 0; i--){
System.out.print(belts[1][i] + " ");
}
}
}
※ 실력진단
728x90
반응형